Получить неполные недели при создании серии в postgresql

Я пытаюсь создать серию дат по неделям с 1 марта 2013 года в 00:00:00 до 14 марта 2013 года в 23:59:59. Запрос, который у меня есть до сих пор, выглядит так

SELECT GREATEST(date_trunc('week', dates.d), 
                date_trunc('month',dates.d)) as start
FROM generate_series(to_timestamp(1362096000),
                     to_timestamp(1363305599), '1 week') as dates(d)

Вывод:

         start
------------------------
 2013-03-01 00:00:00+00
 2013-03-04 00:00:00+00

Запрос частично работает, потому что он возвращает первые две недели, как вы можете видеть, но отсутствует неделя с 11 марта 2013 г. по 14 марта 2013 г. Есть ли способ получить последнюю неделю, даже если она еще не закончилась?


person Eddie    schedule 15.03.2013    source источник


Ответы (2)


Быстрее:

SELECT generate_series(date_trunc('week', '2013-03-01'::date + 6)
                      ,date_trunc('week', '2013-03-14'::date)
                     ,'1 week')::date AS day
UNION  SELECT '2013-03-01'::date
ORDER  BY 1;

Подробное объяснение см. в соответствующем ответе:
Создать в Postgresql ряд интервалов по месяцам и неделям

person Erwin Brandstetter    schedule 15.03.2013

Вы просите generate_series() начать с полуночи 1 марта и закончить ровно через 2 недели минус 1 секунда.

Однако в запрошенном интервале могут быть сгенерированы только 2 значения с разницей ровно в 1 неделю. Если вы увеличите интервал всего на 1 секунду, то generate_series() сгенерирует 3-ю строку, и ваш запрос начнет работать так, как вы ожидаете - демонстрация SQLFiddle:

SELECT GREATEST(
    date_trunc('week', dates.d), 
    date_trunc('month',dates.d)) as start
FROM generate_series(
    to_timestamp(1362096000),
    to_timestamp(1363305599+1), '1 week') as dates(d)
person mvp    schedule 15.03.2013