Недели между двумя датами - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь превратить две даты в серию записей.Одна запись на каждую неделю между датами.

Кроме того, для отсечения недели следует использовать исходные даты начала и окончания, если диапазон начинается или заканчивается в середине недели.Я также предполагаю, что в понедельник начинается неделя.

С датой начала: 05/09/2018 и датой окончания 27/09/2018 Я хотел бы получить следующие результаты:

| # | Start Date   | End date     |
|---------------------------------|
| 0 | '05/09/2018' | '09/09/2018' |
| 1 | '10/09/2018' | '16/09/2018' |
| 2 | '17/09/2018' | '23/09/2018' |
| 3 | '24/09/2018' | '27/09/2018' |

Я достиг определенного прогресса - на данный момент я могу получить общее количество недель между диапазонами дат с помощью:

SELECT (
  EXTRACT(
      days FROM (
                  date_trunc('week', to_date('27/09/2018', 'DD/MM/YYYY')) -
                  date_trunc('week', to_date('05/09/2018', 'DD/MM/YYYY'))
                ) / 7
  ) + 1
) as total_weeks;

Всего недель вернет 4 для вышеуказанного SQL.Вот где я застрял, переходя от целого числа к фактическому набору результатов.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Окно функции вашего друга:

SELECT week_num,
       min(d) AS start_date,
       max(d) AS end_date
FROM (SELECT d,
             count(*) FILTER (WHERE new_week) OVER (ORDER BY d) AS week_num
      FROM (SELECT DATE '2018-09-05' + i AS d,
                   extract(dow FROM DATE '2018-09-05'
                                    + lag(i) OVER (ORDER BY i)
                          ) = 1 AS new_week
            FROM generate_series(0, DATE '2018-09-27' - DATE '2018-09-05') AS i
           ) AS week_days
     ) AS weeks
GROUP BY week_num
ORDER BY week_num;

 week_num | start_date |  end_date  
----------+------------+------------
        0 | 2018-09-05 | 2018-09-09
        1 | 2018-09-10 | 2018-09-16
        2 | 2018-09-17 | 2018-09-23
        3 | 2018-09-24 | 2018-09-27
(4 rows)
0 голосов
/ 18 сентября 2018

В конечном итоге я расширил решение Гордона, чтобы перейти к следующему, однако ответ Лоренца несколько более краткий.

select
  (
    case when (week_start - interval '6 days' <= date_trunc('week', '2018-09-05'::date)) then '2018-09-05'::date else week_start end
  ) as start_date,
  (
    case when (week_start + interval '6 days' >= '2018-09-27'::date) then '2018-09-27'::date else week_start + interval '6 days' end
  ) as end_date
from generate_series(
         date_trunc('week', '2018-09-05'::date),
         '2018-09-27'::date,
          interval '1 week'
      ) gs(week_start);
0 голосов
/ 18 сентября 2018

Использование generate_series():

select gs.*
from generate_series(date_trunc('week', '2018-09-05'::date),
                     '2018-09-27'::date,
                     interval '1 week'
                    ) gs(dte)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...