创建包含给定期间的月份的第一天和最后一天的列表

时间:2014-02-05 17:12:15

标签: sql postgresql date-range generate-series

我必须在特定时间段内为每个月生成一个包含两列日间隔的列表。第一列必须是月份的第一天,第二列必须是月份的最后一天。

例:
开课日期:2014-01-01
结束日期:2014-06-30

结果应分为两列:

1. 2014-01-01 | 2014-01-31
2. 2014-02-01 | 2014-02-28
3. 2014-03-01 | 2014-03-31
4. 2014-04-01 | 2014-04-30
5. 2014-05-01 | 2014-05-31
6. 2014-06-01 | 2014-06-30

我有两个函数可以获取日期的第一天和最后一天。 我试图结合两个系列,但没有运气。

select i::date
from generate_series(first_day('2014-01-01')
                    ,first_day('2014-06-30'), '1 month'::interval) i

select i::date
from generate_series(last_day('2014-01-01')
                    ,last_day('2014-06-30'), '1 month'::interval) i

第二个功能在系列中没有正确显示最后一天。

2 个答案:

答案 0 :(得分:2)

基于this answer

select d::date as start_date,(d + '1 month'::interval - '1 day'::interval )::date end_date
from generate_series('2014-01-01'::date, '2014-06-30'::date, '1 month'::interval) d

答案 1 :(得分:0)

您甚至可以使用单个间隔表达式:

SELECT d AS mon_first
      ,d + interval '1 month - 1 day' AS mon_last
FROM   generate_series(date '2014-01-01'
                      ,date '2014-06-30'
                      ,interval '1 month') d

Details for interval input in the manual.