首页 > 解决方案 > 删除时间范围之间的重叠并在 SQL 中相应地更新值

问题描述

我无法消除日期/时间变量中的重叠。我想相应地替换我的日期/时间值以删除时间线中的所有重叠。例如,我的数据如下所示:

StartTime                  EndTime
 2018-09-17 11:00AM     2018-09-17 12:00PM
*2018-09-17 12:00PM     2018-09-17 01:00PM*      
*2018-09-17 12:30PM     2018-09-17 01:00PM*     
 2018-09-17 01:00PM     2018-09-17 02:00PM 
*2018-09-17 02:00PM     2018-09-17 02:30PM*
*2018-09-17 02:00PM     2018-09-17 03:00PM*    
 2018-09-17 03:00PM     2018-09-17 04:00PM

如您所见,时间段(带 ** 的行)之间存在一些重叠,我想调整 StartTime 或 EndTime 值以避免重叠。例如,我想获得如下所示的决赛桌:

StartTime                  EndTime
 2018-09-17 11:00AM     2018-09-17 12:00PM
*2018-09-17 12:00PM     2018-09-17 12:30PM*      
*2018-09-17 12:30PM     2018-09-17 01:00PM*     
 2018-09-17 01:00PM     2018-09-17 02:00PM 
*2018-09-17 02:00PM     2018-09-17 02:30PM*
*2018-09-17 02:30PM     2018-09-17 03:00PM*    
 2018-09-17 03:00PM     2018-09-17 04:00PM

在某些情况下,需要修改 EndTime(例如该数据中的第一个重叠),有时需要调整 StartTime(例如第二个)。我当前的代码仅适用于第一种情况,并没有捕获数据中的所有重叠。

WITH CTE AS (
SELECT StartTime, 
       LEAD(EndTime,1) OVER (ORDER BY StartTime, EndTime) AS NextStartTime
FROM myTable
)
SELECT StartTime,
       CASE WHEN EndTime > Next_StartTime THEN Next_StartTime 
       ELSE EndTime END AS EndTime
FROM CTE

我知道这看起来很复杂,数据本身也很混乱,但我无法真正对原始数据本身进行更改。我很感激在这个问题上的任何帮助。先感谢您。

标签: sqlsql-server

解决方案


推荐阅读