Developer's Development

[MySQL] DATE_ADD, DATE_SUB (날짜 연산 함수) 본문

개발/MySQL

[MySQL] DATE_ADD, DATE_SUB (날짜 연산 함수)

mylee99 2023. 11. 27. 16:51
함수 및 예시 쿼리
  • [MySQL] 날짜 더하기 : DATE_ADD(기준 날짜, INTERVAL)
    • ex) DB에서 특정 컬럼들의 날짜를 업데이트하고 싶을 때 사용함.
    • UPDATE table_name SET db_date = DATE_ADD(db_date, INTERVAL 9 HOUR);
  • [MySQL] 날짜 빼기 : DATE_SUB(기준 날짜, INTERVAL)
    • ex) DB에서 오늘로부터 3개월 이전의 값을 얻고 싶을 때 사용함.
    • SELECT DATE_SUB(CURDATE(), INTERVAL 3 MONTH) AS three_months_ago;

 

Issue Case
  • DB에 저장된 값에서 특정 날짜와 시간만큼 더한 일자를 사용자에게 노출해야 함.
  • DATE_ADD 함수의 문제점은, 날짜 연산 시 윤년을 고려하지 않음(2월은 28일 혹은 29일이니까).

 

기존 코드
DATE_ADD(DATE_ADD(DB_DATE, INTERVAL DB_DD DAY), INTERVAL DB_TT HOUR)
-- 저장된 DB_DATE 값에 DB_DAY만큼의 일자와, DB_TT만큼의 시간을 더해 원하는 값을 추출

ex) 
DATE_ADD('2023-04-17', INTERVAL 365 DAY)    -> 2024-04-16
DATE_ADD('2023-02-24', INTERVAL 365 DAY)    -> 2024-02-24
▶ 원하는 값은 연도에 1년만 더한, 날짜는 그대로인 값인데 첫 번째 예시는 하루가 줄어있다.

 

수정 코드
(CASE
    WHEN DB_DATE IS NOT NULL AND DB_DD != '365' then DATE_ADD(DATE_ADD(DB_DATE, INTERVAL DB_DD DAY), INTERVAL DB_TT HOUR)
    WHEN DB_DATE IS NOT NULL AND DB_DD = '365' then DATE_ADD(DATE_ADD(DB_DATE, INTERVAL 1 YEAR), INTERVAL DB_TT HOUR)
    ELSE DB_DATE
END) AS DB_DATE

▶ 더해야 할 일자가 365일인 경우, INTERVAL 1 YEAR로 변경

Comments