首页 > 解决方案 > 如何将 PostgreSQL 中的日期四舍五入到上个月或下个月的结束日期?

问题描述

我有一个名为“raw_date”的日期类型列。我需要从中派生另一个日期列,其逻辑是-

1) 如果“raw_date”中的日期介于 1 到 14 之间,则派生日期应该是前一个月的最后一个日期(因此,如果前一个月在 (1,3,5,7,8,10,12) 中,最后一个日期将是31 ; 如果前一个月在 (4,6,9,11) 最后日期将是 30 ;如果前一个月在 (2) 并且年份是闰年,最后日期将是 29,如果它是非闰年,那么它将是 28

2)另外,我需要考虑年份的变化。假设,如果 "raw_date" = '2020-01-12' ,派生日期将是 '2019-12-31'

我正在尝试使用“case”语句并提供明确的上个月日期,但有很多场景,因此无法涵盖逻辑所需的所有场景。如果日期在 1 月的 1 到 14 之间,是否有涵盖所有情况的代码,包括闰年和年份变化。

标签: sqlpostgresql

解决方案


您可以使用case表达式:

(case when extract(day from raw_date) <= 14
      then date_trunc('month', raw_date) - interval '1 day'
      else date_trunc('month', raw_date) + interval '1 month' - interval '1 day'
 end)

是一个 db<>fiddle。


推荐阅读