Выберите Дата, если между начальной и конечной датой любой строки - PullRequest
0 голосов
/ 27 декабря 2018

Я создаю список месяцев, используя метод, показанный здесь: Месяцы между двумя датами

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

Итак, таблица:

client  start_date  end_date
1       2014-06-01  2016-02-29
1       2016-03-01  2016-12-31
1       2017-04-01  NULL

Где NULL представляет все еще активную без будущего набора дату окончания.

Так что я бынравится получать это (я использую EOMONTH для каждого месяца):

2014-06-30
2014-07-31
... ect ...
2016-11-30
2016-12-31
2017-04-30
2017-05-31
... ect ...

Так что месяцев с декабря 2016 года по апрель 2017 года нет.Для каждого клиента может быть любое количество строк.Они могут быть без пробелов, и они могут быть с пробелами, как в случае выше.

1 Ответ

0 голосов
/ 27 декабря 2018

Так что теперь я чувствую себя немного глупо!Все довольно просто:

WITH dates AS (
SELECT  EOMONTH(DATEADD(MONTH, x.number, '2016-01-01')) calendar_month
FROM    master.dbo.spt_values x
WHERE   x.type = 'P'        
    AND x.number <= DATEDIFF(MONTH, '2016-01-01', '2018-12-31'))

SELECT
    dates.calendar_month

FROM
    clients
    LEFT JOIN dates ON dates.calendar_month BETWEEN EOMONTH(clients.start_date) AND EOMONTH(clients.end_date) OR 
        (dates.calendar_month >= clients.start_date AND clients.end_date is NULL)
...