postgresql에서 어제 날짜와 내일 날짜를 구하는 방법을 알아보겠습니다.

 


 현재 시간을 구하는 함수는 now()입니다. 여기서 '1 days'::interval을 뺀 값을 yesterday로 명명하였습니다.

 

 

 결과를 볼까요? 그랬더니, 2023년 5월 23일 22시 24분 16.752초 +0900이 나옵니다.

 

 now() 리턴값의 type을 pg_typeof라는 함수로 할 수 있습니다.

 

 timestamp with time zone이라고 되어 있습니다. 즉 timezone입니다. 이 문서에서 table 9.32는 Date와 Time을 연산할 때 어떤 결과가 나오지에 대해서 설명합니다. timestamp와 interval을 더하면 timestamp가 나오게 됩니다. now()에 '1 days'::interval을 빼 버렸는데요. 이 경우, 1일 이전의 timestamp가 나오게 됩니다.

 

 여기까지 별로 어렵지 않지요? 다음으로 넘어갑시다.

 

 


 남은 과제는 어떻게 timestamp를 YYYY-MM-DD 꼴로 바꾸냐는 것입니다. 이것 역시 문서를 보면 쉽게 파악할 수 있습니다. to_char라는 함수로 timestamp와 string format을 주면 형식에 맞게 문자열로 변환해 버리게 됩니다.

 

 

 현재 시각에서 1 days를 빼 버렸기 때문에 어제 날짜인 2023년 5월 23일이 나옵니다. 이를 YYYY-MM-DD 형식으로 바꾸려고 합니다. 4자리 년도, 2자리 월, 2자리 일 형식입니다. 고로 위와 같이 작성하시면 됩니다.

 

 2023-05-23. 의도하던 결과가 나왔습니다. 고로 하루 전 날짜를 구한다면 to_char(now() - '1 days'::interval, 'YYYY-MM-DD') 로 해 주면 되겠군요. 내일 날짜는 어떻게 구할까요?

 

 그냥 now()에 '1 days'::interval만 더하면 됩니다. 그러면 하루 지난 시각을 표시하게 됩니다.

 

 2023년 5월 25일이 나오네요. 요약하면 현재 timestamp에 '1 days'::interval을 더하면 내일, 빼면 어제를 구할 수 있습니다.

 

 1주일 후의 날짜를 구할 수도 있을까요? 당연합니다. interval은 week 또한 표현할 수 있습니다. 뒤에 W, 혹은 Weeks를 붙이면 됩니다. 예를 들어 '2W'는 2주를 의미합니다. 이것 말고도, interval에는 몇 년을 뜻하는 'Y', 몇 달을 뜻하는 'M', 몇 시간을 뜻하는 'H', 몇 분을 뜻하는 'M', 몇 초를 뜻하는 'S'가 있어요. 해당 쿼리는 현재 시각으로부터 1주 뒤 시각을 구하는 것입니다.

 

 고로, w_after에는 7일이 지난 시각이 표시되게 됩니다.