날짜 데이터에서 년도만, 월까지만 추출하고 싶을 때 사용하는 함수가 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
그 달의 첫 날짜를 구하고, 한 달을 더해주고, 거기서 하루를 빼는 방법인데
이걸 외우기 보다는 어디 써놓고 복붙해서 쓰는 걸 추천한다고 했다!