如何在PostgreSQL中将日期四舍五入为上个月或下个月的结束日期?

时间:2020-05-01 16:01:08

标签: sql postgresql

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

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

2)另外,我需要考虑年份变化。假设如果“ raw_date” ='2020-01-12',则导出日期将为'2019-12-31'

我正在尝试使用'case'语句并提供明确的上个月日期,但是有很多方案,因此无法涵盖按照逻辑要求的所有方案。 如果1月的日期在1到14之间,是否可以有一个代码涵盖所有场景,包括leap年和年份更改。

1 个答案:

答案 0 :(得分:1)

您可以使用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)

Here是db <>小提琴。