Создать список с первым и последним числом месяца за указанный период

Мне нужно создать список с двумя столбцами дневных интервалов для каждого месяца в определенный период. Первый столбец должен быть первым днем ​​месяца, а второй столбец - последним днем ​​месяца.

Пример:
Дата начала: 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

Вторая функция неправильно показывает последний день, когда он входит в серию.


person user3276142    schedule 05.02.2014    source источник


Ответы (2)


На основании этого ответа:

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
person Houari    schedule 05.02.2014

Добавьте месяц и вычтите день - в выражении одного интервала:

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

Дополнительная литература (конец дня очень похож на последний день месяца):

О создании временного ряда:

person Erwin Brandstetter    schedule 05.02.2014