sql-server-2012 - 如果在任何行的开始日期和结束日期之间,请选择日期
问题描述
我正在使用此处显示的方法创建月份列表:两个日期之间的月份
一旦我有了这些日期,我只想保留它们在特定客户的任何行的开始日期和结束日期之间的日期。
所以表格是:
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 月之间的月份不存在。每个客户端可以有任意数量的行。它们可能没有间隙,也可能有间隙,如上例所示。
解决方案
所以我现在觉得有点傻!这很简单:
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)
推荐阅读
- c# - WebClient DownloadFileCompleted 事件未在最后一项中调用
- python - 使用多行作为 pandas 的列标题
- python - Python:为什么这个正则表达式不起作用?
- c# - Win 表单,选中时如何为单选按钮分配方法
- parsing - 如何使用 FastParse 处理文本表?
- c# - 在 .net core clobbers SQL Server 数据库中以逐字字符串 (@) 运行原始选择查询
- python - 使用 keras 保存模型
- javascript - 创建来自外国的服务人员
- sql - 从重叠的日期范围创建新的日期范围并分配一个 ID
- java - 如何检查音乐何时结束