我正在使用此处显示的方法创建月份列表:Months between two dates
一旦有了这些日期,我只想保留特定客户在任何行的开始日期和结束日期之间的日期。
所以表是:
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表示仍处于活动状态,而未设置将来的end_date。
所以我想得到的是(我每个月都使用EOMONTH):
2014-06-30
2014-07-31
... ect ...
2016-11-30
2016-12-31
2017-04-30
2017-05-31
... ect ...
因此,2016年12月至2017年4月之间的月份不存在。每个客户端可以有任意数量的行。与上面的情况一样,它们可能没有缝隙,也可能有缝隙。
答案 0 :(得分:0)
所以我现在有点傻了!很简单:
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)