[PostgreSQL] date_trunc 이용해서 날짜 자르기

hyeji·2023년 2월 14일
0

날짜 데이터에서 년도만, 월까지만 추출하고 싶을 때 사용하는 함수가 date_trunc다.

date_trunc(자르고 싶은 날짜 형식, 날짜)

이 때, 날짜 부분에는 ‘2022-02-14’ 이렇게 넣으면 오류가 발생하기 때문에 to_date 혹은 ::date 를 이용해서 날짜 형식으로 바꿔주는 작업이 필요하다.

date_trunc는 보통 group by 할 때 많이 사용한다.
ex) 월 별 매출 구하기, 연도 별 입사자 수 구하기 등

select date_trunc('day','2023-02-14')
-> SQL Error [42725]: 오류: 함수 date_trunc(unknown, unknown) 는 유일성을 가지지 못합니다(not unique)

date_trunc를 사용 하면 반환 값은 무조건 timestamp로 나오기 때문에 date 형식을 사용하고 싶으면 직접 바꿔줘야 한다.

select date_trunc('day','2023-02-14'::date)
-> 2023-02-14 00:00:00.000 --timestamp형식

select date_trunc('day','2023-02-14'::date)::date
-> 2023-02-14

date_trunc를 이용해 year, month, day 단위로 잘라보자!

select date_trunc('year','2023-02-14'::date)::date as date1,
			 date_trunc('month','2023-02-14'::date)::date as date2,
			 date_trunc('day','2023-02-14'::date)::date as date3

위 코드를 실행시키면 아래와 같은 결과가 나온다.

year을 기준으로 자르면 그 해의 첫 날인 1월 1일을 반환하고,

month를 기준으로 자르면 그 달의 첫 날인 2월 1일을 반환하고,

day를 기준으로 자르면 그 날의 시간을 제외하고 2월 14일을 반환한다.

week를 기준으로 date_trunc를 사용하면 어떤 결과가 나올까?

select date_trunc('week','2023-02-14'::date)::date
-> 2023-02-13

week를 기준으로 date_trunc를 사용하면 그 주의 첫 날인 ‘월요일’의 날짜를 반환한다.

그 주의 마지막 날짜를 구하고 싶다면 저번 포스팅에서 봤던 **interval** 을 사용하면 된다.

select (date_trunc('week', '2023-02-14'::date) + interval '6 days')::date
-> 2023-02-19

interval ‘6 days’ 를 써주면 그 주 일요일 날짜를 반환한다.

month를 이용하면 그 달의 첫 날을 알 수 있는데, 마지막 날을 알고 싶으면 어떻게 해야할까?

select (date_trunc('month', '2023-02-14'::date) + interval '1 month' - interval '1 day')::date

그 달의 첫 날짜를 구하고, 한 달을 더해주고, 거기서 하루를 빼는 방법인데

이걸 외우기 보다는 어디 써놓고 복붙해서 쓰는 걸 추천한다고 했다!

profile
Data Analyst

0개의 댓글