Skip to main content

[SQL] MySQL 날짜 처리 시 주의사항


1. DATE_FORMAT()

날짜를 원하는 형식으로 변환할 때 사용한다. DATE_FORMAT() 함수는 MySQL에서 제공하는 고유 함수이다. PostgreSQL이나 Oracle에서는 TO_CHAR() 함수를 쓴다. 그래서 DB마다 쿼리 이식할 때 날짜 포맷 함수 부분은 꼭 확인해야 한다. 날짜를 문자열로 변환하기 때문에, 결과를 다시 날짜 연산에 쓰려면 변환이 필요하다. 출력용 포맷팅에 적합하다.

SELECT DATE_FORMAT('2022-05-01', '%Y-%m-%d') AS formatted_date;
-- 결과: 2022-05-01

예를 들어,

  • PostgreSQL : TO_CHAR() 함수
SELECT TO_CHAR(current_date, 'YYYY-MM-DD');
  • Oracle : TO_CHAR() 함수
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual;
  • SQL Server : FORMAT() 함수 (2012 이상) 또는 CONVERT() 함수
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd');
-- 또는
SELECT CONVERT(VARCHAR, GETDATE(), 23);

2. 단순 비교 (<=, >=, =, <, >)

SELECT *
FROM orders
WHERE order_date >= '2022-05-01' AND order_date <= '2022-05-31';
  • 문자열 'YYYY-MM-DD'를 날짜로 자동 인식해서 비교한다.
  • 날짜 범위 조건 설정이 가능하다

주의사항

  • >= '2022-05-01'는 5월 1일 00:00:00부터 포함
  • <= '2022-05-31'는 5월 31일 00:00:00까지만 포함 (시간 없는 날짜 타입인 경우 해당 날짜 전체 포함)
  • 만약 DATETIME 타입이라면 '2022-05-31'는 '2022-05-31 00:00:00' 이라서, 5월 31일 하루 전체를 포함하려면 '2022-05-31 23:59:59'로 해야 한다.

3. BETWEEN ... AND ...

SELECT *
FROM orders
WHERE order_date BETWEEN '2022-05-01' AND '2022-05-31';
  • BETWEEN은 시작일과 종료일 모두 포함한다. (>=, <=)
  • 위 쿼리는 5월 1일부터 5월 31일까지 모두 포함하는 조건이다.

주의사항

  • BETWEEN은 양 끝값 포함인거 꼭 기억하자
  • 그래서 데이터가 DATETIME 타입일 때 종료일 포함 범위인거 꼭 주의하자
  • BETWEEN이랑 >= ... AND <= ...는 동일 조건

4. YEAR(), MONTH() 함수

SELECT *
FROM orders
WHERE YEAR(order_date) = 2022 AND MONTH(order_date) = 5;
  • YEAR() : 날짜에서 연도만 뽑음
  • MONTH() : 날짜에서 월만 뽑음

주의사항

  • 이 함수들은 컬럼에 대해 함수 적용하기 때문에 인덱스가 있어도 인덱스 사용이 어려워서 성능 이슈가 생길 수 있음
  • 대량 데이터 조회 시에는 범위 조건(BETWEEN, >=, <=) 사용하는게 더 효율적임

image.png


참고 자료 : chatGPT