CodeGym /행동 /SQL SELF /날짜/시간 데이터 자르기와 반올림: DATE_TRUNC()

날짜/시간 데이터 자르기와 반올림: DATE_TRUNC()

SQL SELF
레벨 32 , 레슨 0
사용 가능

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()는 항상 지정한 단위의 "시작"으로 잘라. 진짜 반올림이 필요하면 다른 방법을 써야 해.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION