저번에 group by week를 하는 방법을 알아보았습니다. to_char와 IYYY IW format을 이용해서 했었습니다. 그런데, 이 방법 말고도, date_trunc라는 함수를 이용해서 하는 방법도 있어요. 간단하게 알아보겠습니다.

 


 문서에 따르면 field가 가능한 것 중 하나가 'week'가 있어요. 이는 "주"를 의미합니다.

 

 

 2022년 11월 6일을 date_trunc의 soruce로, field로 'week'를 넘겨 보겠습니다.

 

 

 그러면 2022년 10월 31일 00:00:00.000 +0900이 나오는데요. 이는 2022년 10월 31일이 월요일이기 때문입니다. 11월 1일이 화요일이고, 11월 6일이 일요일입니다. 한 주의 시작을 월요일이라고 하면 11월 6일은 10월 31일이 시작인 주에 속한 것입니다. 따라서 10월 31일이 리턴됩니다.

 

 

 2022년 1월 2일은 일요일입니다. 해당 날짜는, 2021년 12월 27일 ~ 2022년 1월 2일 주에 속해있습니다.

 

 

 2022년 1월 2일을 source로 넘겨주고, field로 'week'를 주겠습니다. 어떻게 출력이 될까요?

 

 2021년 12월 27일로 출력이 됩니다. 이는, 2022년 1월 2일이 속한 주가 2021-12-27부터 시작되기 때문입니다.

 

 

 2020년 1월 달력 중 일부입니다. 2020년 1월 5일을 'week'로 date_trunc를 수행하면 어떤 결과가 나올까요? 아마도 제 예상 결과로는 2019년 12월 30일이 나올 겁니다. 왜냐하면, 월요일이 주의 시작인 경우, 2019-12-30 ~ 2020-01-05까지 한 주로 묶어낼 수 있기 때문입니다.

 

 

 위와 같이 입력해 보겠습니다.

 

 결과는 2019-12-30이 나옵니다.

 

 


 분기로 trunc를 시킬 수도 있을까요? 네. 가능합니다. 예를 들어 분기별로 매출을 구해야 한다고 해 봅시다. 그러면 group by ~년 ~분기가 들어갈 텐데요. 이 때에도 date_trunc 등을 쓸 수는 있습니다.

 

 

  예를 들어, 2022년 9월 5일은 2022년 3분기입니다. 3분기의 시작일은 7월 1일이므로, 위의 쿼리를 호출하면 아래와 같이 나옵니다.

 

 

 2022년 7월 1일. 그런데, 이건 우리가 원하는 YYYY년 C분기 꼴이 아닙니다. 저렇게 나오려면, to_char를 써야 하는데요.

 

 

 1번째 인자에 date를, 2번째 인자에 'YYYY Q'를 입력하면 됩니다. 이 때 Q는 Quarter를 의미합니다. 2020년 1월 2일은 2020년 1분기이니, 2020 1과 같이 출력될 겁니다.

 

 생각한 대로 제대로 나왔군요. 만약에 2번째 인자에 'IYYY Q'를 입력하면 어떻게 될까요? IYYY는 ISO 8601 포멧을 따르는데요. 대부분의 경우 제대로 작동할 거 같지만, 1월 1일 근처의 데이터에 대해서 제대로 작동을 안 하는 케이스가 존재합니다.

 

 

 예를 들어, 2019년 12월 30일은 월요일입니다. 이 주의 목요일은 2020년 1월 2일인데요. 2020년의 첫 목요일은 1월 2일입니다. 그렇기 때문에, 시작일이 2019-12-30인 주는 2020년의 첫 주가 됩니다. 따라서 IYYY는 2020이 리턴됩니다. 그런데, 12월 30일은 4분기입니다. 고로, Q는 4가 출력되겠네요.

 

 

 앗아.. 고로, "YYYY Q"로 쓰는 게 적합하다고 할 수 있겠습니다.