【发布时间】:2018-01-24 14:41:28
【问题描述】:
我有一个包含 3 列的表:
Name | Datetime_Start | Datetime_End
A | 2017-01-02 00:00 | 2017-03-28 00:10
A | 2017-05-14 23:50 | 2017-05-29 23:50
B | 2017-05-18 00:00 | 2017-05-18 04:00
B | 2017-05-18 02:00 | 2017-05-18 03:00
C | 2017-01-02 00:00 | 2017-01-17 15:50
C | 2017-01-14 03:50 | 2017-01-28 15:50
我希望输出是这样的,(基本上将重叠的时段合并为一个):
Name | Datetime_Start | Datetime_End
A | 2017-01-02 00:00 | 2017-03-28 00:10
A | 2017-05-14 23:50 | 2017-05-29 23:50
B | 2017-05-18 00:00 | 2017-05-18 04:00
C | 2017-01-02 00:00 | 2017-01-28 15:50
我尝试使用这里的建议:Eliminate and reduce overlapping date ranges
但我的结果没有正确合并,我认为这是由于我的日期时间值的时间部分...
如果一个句点恰好在另一个句点开始的那一刻结束,则应合并这些句点。
select Name, Min(NewStartDate) Datetime_Start, MAX(Datetime_End) Datetime_End
from
(
select *,
NewStartDate = t.Datetime_Start+n.number,
NewStartDateGroup =
dateadd(d,
1- DENSE_RANK() over (partition by Name order by t.Datetime_Start+n.number),
t.Datetime_Start+n.number)
from Mytable t
inner join dbo.Numbers n
on n.number <= DATEDIFF(d, Datetime_Start, Datetime_End)
) X
group by Name, NewStartDateGroup
(dbo.Numbers 包含 1 列从 0 到 1 000 000 的数值)
输出:
Name | Datetime_Start | Datetime_End
A | 2017-11-04 00:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-04 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-05 00:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-05 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-06 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-07 00:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-07 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-08 00:10:00.000 | 2017-12-05 15:10:00.000
【问题讨论】:
-
发布(使用Edit 添加到您的问题)您解决问题的最佳尝试并解释其产生的结果有什么不正确之处。
-
另外,请澄清端点是排他性的还是包含性的,如果一个时期在另一个时期开始的确切时刻结束会发生什么 - 应该合并还是将它们视为单独的时期?
标签: sql-server date datetime overlapping