【问题标题】:Postgres: first and last days of any monthPostgres:任何一个月的第一天和最后一天
【发布时间】:2015-02-06 06:09:33
【问题描述】:

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

我希望能够选择其中 StartDate 是任何一个月的第一天并且 EndDate 是任何一个月的最后一天的任何行。 (如果 StartDate = FirstDayOfMonth AND EndDate = LastDayOfMonth THEN 'b')。

例如当 StartDate = '01-02-2011' 和 EndDate = '31-05'2012' 然后是'b',或者 StartDate = '01-11-1996' 和 EndDate = '31-01-2001' 然后是'b'。

【问题讨论】:

    标签: postgresql date


    【解决方案1】:

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

    # 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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-07
        • 2015-07-09
        • 1970-01-01
        • 2016-02-09
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多