DATE_TRUNC()는 네가 날짜/시간 값을 특정 단위로 잘라낼 수 있게 해주는 강력한 도구야. 예를 들어, 이걸로 타임스탬프를 하루, 한 달, 한 해, 한 시간의 시작으로 반올림할 수 있어. 특히 기간별로 데이터 분석할 때(예를 들어 주문을 일별, 월별, 연도별로 묶고 싶을 때) 엄청 유용하지.
날짜랑 시간을 긴 문자열이라고 생각해봐. 거기엔 시, 분, 초가 다 들어있지. DATE_TRUNC() 함수는 이 문자열에서 네가 원하는 부분만 남기고 나머지는 "잘라내" 주는 거야. 예를 들면:
- 날짜
2023-10-01 15:30:45를 하루의 시작으로 자르고 싶어. 결과는2023-10-01 00:00:00가 돼. - 아니면 한 시간의 첫 번째 초만 남기고 싶으면
2023-10-01 15:00:00가 되지.
문법
DATE_TRUNC() 함수의 문법은 이렇게 생겼어:
DATE_TRUNC(field, source)
- field — 날짜/시간을 어디까지 "자를지" 정하는 단위야. 예를 들어
year,month,day,hour,minute같은 거지. - source — 네가 자르고 싶은 날짜/시간 값이야.
TIMESTAMP타입 컬럼이거나,NOW()같은 함수 결과일 수도 있어.
간단한 호출 예시:
SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45');
-- 결과: 2023-10-01 00:00:00
지원하는 필드
DATE_TRUNC()에서 쓸 수 있는 대표적인 시간 단위들 목록이야:
| 시간 단위 | 설명 |
|---|---|
year |
연도 시작 (예: 2023-01-01 00:00:00) |
quarter |
분기 시작 (예: 2023-07-01 00:00:00) |
month |
월 시작 (예: 2023-10-01 00:00:00) |
week |
주 시작* (예: 2023-09-25 00:00:00) |
day |
일 시작 (예: 2023-10-01 00:00:00) |
hour |
시작 (예: 2023-10-01 15:00:00) |
minute |
분 시작 (예: 2023-10-01 15:30:00) |
second |
초 시작 (예: 2023-10-01 15:30:45) |
단위가 작아질수록 더 정밀하게 잘라낼 수 있어. 참고로, 주는 일요일부터 시작해 :)
DATE_TRUNC() 사용 예시
하루의 시작으로 자르기. 이 예제에선 타임스탬프를 하루의 시작으로 반올림해볼 거야:
SELECT DATE_TRUNC('day', TIMESTAMP '2023-10-01 15:30:45') AS truncated_day;
-- 결과: 2023-10-01 00:00:00
월의 시작으로 자르기. 이번엔 날짜를 월의 시작으로 잘라보자:
SELECT DATE_TRUNC('month', TIMESTAMP '2023-10-01 15:30:45') AS truncated_month;
-- 결과: 2023-10-01 00:00:00
연도의 시작으로 자르기. 이번엔 연도의 시작으로 반올림해볼게:
SELECT DATE_TRUNC('year', TIMESTAMP '2023-10-01 15:30:45') AS truncated_year;
-- 결과: 2023-01-01 00:00:00
현재 시간(NOW())이랑 같이 쓰기. 항상 현재 날짜/시간을 기준으로 작업하고 싶으면 DATE_TRUNC()랑 NOW()를 같이 쓰면 돼:
SELECT DATE_TRUNC('hour', NOW()) AS truncated_hour;
-- 결과는 현재 시간에 따라 달라져. 예: 2023-10-01 15:00:00
주문을 월별로 그룹핑하기. 좀 더 실전 예제로 가보자. 주문 날짜가 들어있는 테이블이 있다고 치자. 각 월별로 주문 개수를 세고 싶어:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date TIMESTAMP NOT NULL
);
INSERT INTO orders (order_date) VALUES
('2023-10-01 10:15:00'),
('2023-10-01 15:30:00'),
('2023-09-15 12:45:00'),
('2023-08-20 09:00:00'),
('2023-08-25 10:30:00');
SELECT DATE_TRUNC('month', order_date) AS order_month,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_month
ORDER BY order_month;
결과:
| order_month | total_orders |
|---|---|
| 2023-08-01 00:00 | 2 |
| 2023-09-01 00:00 | 1 |
| 2023-10-01 00:00 | 2 |
실전 활용 케이스
기간별 시간 데이터 분석: 매년, 매월, 매일 몇 명의 사용자가 가입했는지 알고 싶어? DATE_TRUNC()로 데이터 그룹핑하면 돼.
리포트 만들기: 날짜/시간을 제대로 반올림하면 리포트가 훨씬 보기 좋아져.
날짜/시간 비교: 밀리초까지 있는 고정밀 타임스탬프가 있다면, 원하는 수준까지 잘라서 비교해야 정확해.
DATE_TRUNC() 쓸 때 자주 하는 실수
지원 안 하는 필드 쓰기. 예를 들어 millisecond 필드는 지원 안 해서 쓰면 에러 나.
잘못된 데이터 타입. DATE_TRUNC()는 TIMESTAMP 같은 시간 타입만 받아. 문자열을 넣으면 에러야.
반올림 실수. DATE_TRUNC()는 항상 지정한 단위의 "시작"으로 잘라. 진짜 반올림이 필요하면 다른 방법을 써야 해.
GO TO FULL VERSION