在SQL中删除时间范围和相应更新值之间的重叠

在SQL中删除时间范围和相应更新值之间的重叠,sql,sql-server,Sql,Sql Server,我无法消除日期/时间变量中的重叠。我想相应地替换日期/时间值,以删除时间线中的所有重叠。例如,我的数据如下所示: 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:0

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

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
 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
如您所见,时间段(带**的行)之间存在一些重叠,我想调整StartTime或EndTime值以避免重叠。例如,我希望得到最终的表,如下所示:

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
 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
在某些情况下,需要修改结束时间(例如,此数据中的第一个重叠),有时需要调整开始时间(例如,第二个重叠)。我当前的代码只适用于第一种情况,不能捕获数据中的所有重叠

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

我知道这看起来很复杂,数据本身也很混乱,但我不能真正改变我的原始数据本身。我非常感谢在这个问题上的任何帮助。提前谢谢。

确定哪一列应该更改的逻辑是什么?您的描述是不确定的。@GordonLinoff,其背后的逻辑是时间范围应在同一日期内连续(.例如2018-09-17)。因此,对于第一个重叠,如果您只需将EndTime从下午1:00调整到下午12:30,我可以删除重叠,并且时间值将是连续的,没有任何中断。(例如下午12:00-12:30/1230至下午1:00)。但是如果你在下午2点到3点之间看到第二个重叠,如果你把开始时间定在下午2点到2点30分,数据将是连续的,没有任何中断或重叠。另外,我想说,如果数据是连续的,当前行的结束时间应该等于下一行的开始时间。但重要的是,如果时间被分解成一个不到小时的单位,我想抓住所有这些小片段,而不是把时间分解成小时。例如,类似“2018-09-17 12:30PM 2018-09-17 01:00PM”的内容应该作为一个单独的单元捕获,而不是将其放入2018-09-17 12:00PM 2018-09-17 01:00PMHi-您似乎没有实际描述需要应用的逻辑。似乎有3个选项:1)始终调整开始日期以与前一行的结束日期对齐2)始终调整结束日期以与下一行的开始日期对齐3)根据需要明确定义的某些逻辑调整开始或结束日期。此外,当您说“在同一日期内连续”时,记录的开始日期和结束日期是否会在午夜重叠?如果可以,这是否会影响您需要应用的逻辑?