Postgres:任何月份的第一天和最后一天

时间:2014-12-08 14:45:27

标签: postgresql date

我在postgres中有两个日期列:'StartDate'和'EndDate'。 我需要使用不同的代码分配日期范围的各种组合。 例如 IF StartDate = EndDate那么'a'

我希望能够做的是选择任何行,其中StartDate是任何月份的第一天,EndDate是任何月份的最后一天。 (IF StartDate = FirstDayOfMonth AND EndDate = LastDayOfMonth那么'b')。

e.g。当StartDate = '01 -02-2011'并且EndDate = '31 -05'2012'然后'b',或者StartDate = '01 -11-1996'和EndDate = '31 -01-2001'然后'b'。

2 个答案:

答案 0 :(得分:3)

最容易获得一个月的第一天和最后一天是依靠日期算术,例如:

# select date_trunc('month', now()::date);
       date_trunc       
------------------------
 2014-12-01 00:00:00+01
(1 row)

# select date_trunc('month', now()::date)
         + interval '1 month'
         - interval '1 day';
        ?column?        
------------------------
 2014-12-31 00:00:00+01
(1 row)

如果需要,请注意您可以使用generate_series()计算两个日期之间的完整列表:

select d as first_day,
       d + interval '1 month' - interval '1 day' as last_day
from generate_series('2014-01-01'::date,
                     '2014-12-01'::date,
                     '1 month') as d;
       first_day        |        last_day        
------------------------+------------------------
 2014-01-01 00:00:00+01 | 2014-01-31 00:00:00+01
 2014-02-01 00:00:00+01 | 2014-02-28 00:00:00+01
 2014-03-01 00:00:00+01 | 2014-03-31 00:00:00+02
 2014-04-01 00:00:00+02 | 2014-04-30 00:00:00+02
 2014-05-01 00:00:00+02 | 2014-05-31 00:00:00+02
 2014-06-01 00:00:00+02 | 2014-06-30 00:00:00+02
 2014-07-01 00:00:00+02 | 2014-07-31 00:00:00+02
 2014-08-01 00:00:00+02 | 2014-08-31 00:00:00+02
 2014-09-01 00:00:00+02 | 2014-09-30 00:00:00+02
 2014-10-01 00:00:00+02 | 2014-10-31 00:00:00+01
 2014-11-01 00:00:00+01 | 2014-11-30 00:00:00+01
 2014-12-01 00:00:00+01 | 2014-12-31 00:00:00+01
(12 rows)

答案 1 :(得分:0)

您可以提取日期的day部分并检查其值。对于该月的第一天,它应该是1,而对于最后一天 - 您只需在该日期添加一天并检查它是否是下个月的第一天,这将意味着原始日期是最后一天当月。

...
CASE WHEN
  EXTRACT('day' FROM StartDate) = 1
    AND
  EXTRACT('day' FROM EndDate + '1 day'::interval) = 1
THEN 'b'
...