DB

[MySQL] DATE, TIME, YEAR 등 날짜/시간 추출 함수 모음

인생아 2025. 7. 22. 20:04
반응형

MySQL에서 날짜 데이터 중에서 연도만, 월만, 시간만, 또는 요일만 따로 추출하고 싶을 때 어떤 함수를 써야 할까? 이럴 때는 DATE(), TIME(), YEAR(), MONTH(), DAY(), HOUR() 등 다양한 추출 함수들을 적절히 활용하면 된다. 

DATE() 함수 - 날짜만 추출하기

DATETIME 타입에서 날짜만 따로 추출할 수 있는 함수다. 예를 들어 2025-07-22 14:20:30에서 2025-07-22만 뽑아올 수 있다

SELECT DATE('2025-07-22 14:20:30');
-- 결과: 2025-07-22

주로 WHERE 조건절에서 날짜 비교용으로 사용되며 CURDATE()와 함께 자주 쓰인다

SELECT * FROM orders
WHERE DATE(order_date) = CURDATE();
반응형

TIME() 함수 - 시간만 추출하기

DATE()가 날짜만 뽑는다면, TIME() 함수는 시간만 추출한다. 2025-07-22 14:20:30에서 14:20:30을 추출할 수 있다

SELECT TIME('2025-07-22 14:20:30');
-- 결과: 14:20:30

로그 테이블에서 특정 시간대의 데이터를 분석할 때 유용하다

SELECT * FROM access_logs
WHERE TIME(access_time) BETWEEN '14:00:00' AND '15:00:00';

YEAR(), MONTH(), DAY() 함수

날짜 데이터에서 연도/월/일을 개별적으로 추출할 수 있다. 이 세 가지 함수는 집계 통계 작업에서 매우 자주 사용된다

SELECT
  YEAR('2025-07-22') AS 연도,
  MONTH('2025-07-22') AS 월,
  DAY('2025-07-22') AS 일;
-- 결과: 2025 | 7 | 22

예를 들어 연도별 주문 건수를 집계할 수 있다

SELECT YEAR(order_date) AS order_year, COUNT(*) AS cnt
FROM orders
GROUP BY order_year;

혹은 월별 매출 통계를 구할 수도 있다

SELECT MONTH(order_date) AS order_month, SUM(amount) AS total
FROM orders
WHERE YEAR(order_date) = 2025
GROUP BY order_month;

HOUR(), MINUTE(), SECOND() 함수

시간 단위로도 세분화하여 데이터를 추출할 수 있다. 하루 24시간 기준으로 통계 데이터를 볼 때 자주 사용된다

SELECT
  HOUR('14:20:30') AS 시,
  MINUTE('14:20:30') AS 분,
  SECOND('14:20:30') AS 초;
-- 결과: 14 | 20 | 30

예제: 접속 시간대별 유입 수 분석

SELECT HOUR(login_time) AS hour, COUNT(*) AS login_count
FROM user_logins
GROUP BY hour;
반응형

DAYOFWEEK(), DAYNAME() 함수 - 요일 추출

날짜에서 요일을 추출하고 싶은 경우도 많다. 예를 들어 쇼핑몰에서 주말 방문자 수를 분석하거나, 특정 요일에만 프로모션을 적용하고 싶을 때 사용할 수 있다

SELECT DAYOFWEEK('2025-07-22'); -- 결과: 3 (일요일=1, 월요일=2, …)
SELECT DAYNAME('2025-07-22');   -- 결과: Tuesday

실무에서는 요일별로 트래픽 분석 시 유용하다

SELECT DAYNAME(visit_time) AS 요일, COUNT(*) AS 방문자수
FROM page_views
GROUP BY 요일;

실무 활용 팁

  1. DATE(created_at) = CURDATE()와 같이 추출 함수는 인덱스를 무시할 수 있으므로 성능이 중요한 쿼리에서는 BETWEEN이나 >= 방식이 더 좋다
  2. YEAR()나 MONTH()로 그룹핑할 때는 GROUP BY와 ORDER BY에 함께 사용하면 보기 좋고 정렬도 자연스럽다
  3. 날짜 필드가 NULL일 수 있는 경우, IFNULL()이나 COALESCE()로 처리해주는 습관도 중요하다

집계 + 추출 함수 조합 예제

SELECT 
  YEAR(order_date) AS 년도,
  MONTH(order_date) AS 월,
  COUNT(*) AS 주문건수,
  SUM(total_price) AS 매출합계
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2025-12-31'
GROUP BY 년도, 월
ORDER BY 년도, 월;

위 쿼리는 최근 2년치 주문 데이터를 연도-월 기준으로 집계하는 가장 실무적인 예제 중 하나다

정리

  • DATE(): 날짜만 추출
  • TIME(): 시간만 추출
  • YEAR(), MONTH(), DAY(): 연도, 월, 일 추출
  • HOUR(), MINUTE(), SECOND(): 시간 단위 추출
  • DAYOFWEEK(), DAYNAME(): 요일 추출

이 함수들은 MySQL 날짜 데이터 처리의 기본 중의 기본이며, 실무에서 시간 기반 필터링이나 통계 작업을 위해 반드시 익혀야 한다

참고 문서

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

반응형