2017-11-01 5 views
0

테이블의 필드에 따라 date_add 간격 유형을 변경하는 방법은 무엇입니까?

  • TF_wk => WEEK
  • TF_mon => MONTH

    +-------------------+-----------------+---------------------+ 
    | INTERVAL_QUANTITY | INTERVAL_UOM_ID | LAST_UPDATED_STAMP | 
    +-------------------+-----------------+---------------------+ 
    | 10    | TF_wk   | 2017-10-31 17:21:40 | 
    | 20    | TF_mon   | 2017-10-30 17:21:40 | 
    | 30    | TF_day   | 2017-10-29 17:21:40 | 
    +-------------------+-----------------+---------------------+ 
    

    키, (이것은 다른 행하지만 쿼리에 사용되는 아래의 사람이있다) 다음 표를 상상해

  • TF_day => DAY

지금, 나는 다음과 같은 쿼리를 가지고

SELECT 
    * 
FROM 
    product_maint 
WHERE 
    (INTERVAL_UOM_ID = 'TF_day' OR INTERVAL_UOM_ID = 'TF_wk' OR INTERVAL_UOM_ID = 'TF_mon') 
    AND DATEDIFF(DATE(DATE_ADD(LAST_UPDATED_STAMP, INTERVAL INTERVAL_QUANTITY DAY)), DATE(NOW())) <= 0; 

문제는 마찬가지로 때하는 TF_wkINTERVAL_UOM_ID하고 실제로 70일에 추가해야합니다 10INTERVAL_QUANTITY하지 10일이있는 행을 선택 때, INTERVAL_UOM_IDTF_mon이고 INTERVAL_QUANTITY20 인 경우 560 일을 추가해야합니다 (내 수학이 정확하다고 가정).

어떻게하면이 로직을 구현할 수 있습니까?

답변

1

각 간격을 개별적으로 확인해야합니다. 내가 CURDATE()NOW()을 변경

WHERE (INTERVAL_UOM_ID = 'TF_day' AND 
     LAST_UPDATED_STAMP > CURDATE() - INTERVAL INTERVAL_QUANTITY DAY 
    ) OR 
     (INTERVAL_UOM_ID = 'TF_wk' AND 
     LAST_UPDATED_STAMP > CURDATE() - INTERVAL INTERVAL_QUANTITY WEEK 
    ) OR 
     (INTERVAL_UOM_ID = 'TF_mon' AND 
     LAST_UPDATED_STAMP > CURDATE() - INTERVAL INTERVAL_QUANTITY MONTH 
    ) 

참고 : 나는 당신이 원하는 생각합니다. 나는 시간 구성 요소가 당신이 원하는 것에 중요하다고 생각하지 않습니다. 또한 내가 날짜 산술에서만 작동하도록 논리를 변경했음을 주목하십시오.

+0

위의 쿼리를 사용하여 어떤 이유로 든 모든 행을 표시하고 논리가 어딘가에 깨졌습니다. – Script47

+0

'TF_ *'체크와 DATE 체크를 결합하는 논리를 사용하면 비교 방법을 사용할 때 저에게 효과적이었습니다. 그래서 기본적으로' \t product_maint 로부터 \t * 을 선택 WHERE \t (INTERVAL_UOM_ID = 'TF_day' \t 및 DATEDIFF (DATE (DATE_ADD (LAST_UPDATED_STAMP, 간격 INTERVAL_QUANTITY DAY)), DATE (NOW())) <= 0) OR ( \t INTERVAL_UOM_ID = 'TF_wk' \t AND DATEDIFF (DATE_ADD (DATE (LAST_UPDATED_STAMP) INTERVAL INTERVAL_QUANTITY WEEK) DATE (NOW())) <= 0) OR (INTERVAL_UOM_ID = 'TF_mon' \t AND DATEDIFF (DATE (DATE_ADD (LAST_UPDATED_STAMP, INTERVAL INTERVAL_QUANTITY MONTH)), DATE (NOW())) <= 0); – Script47