Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修复SQL Server中列中的重叠日期/时间范围_Sql_Sql Server - Fatal编程技术网

修复SQL Server中列中的重叠日期/时间范围

修复SQL Server中列中的重叠日期/时间范围,sql,sql-server,Sql,Sql Server,我是SQL新手,想知道是否有办法使用SQL Server分割数据中的重叠时间范围。例如,我当前的数据如下所示: StartDateTime EndDateTime 2018-09-17 11:00AM 2018-09-17 12:00PM 2018-09-17 12:00PM 2018-09-17 01:00PM * Overlap 2018-09-17 12:30PM 2018-09-17 01:00PM * Overlap 20

我是SQL新手,想知道是否有办法使用SQL Server分割数据中的重叠时间范围。例如,我当前的数据如下所示:

StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 12:30PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
2018-09-17 02:00PM     2018-09-17 03:00PM  
2018-09-17 03:00PM     2018-09-17 0:00PM
StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 12:30PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 12:30PM      * Overlap
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
如您所见,当前数据集中存在重叠时间,我希望按升序拆分和重新排列它们

最终输出如下所示:

StartDateTime           EndDateTime
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 03:00PM  
2018-09-17 03:00PM     2018-09-17 0:00PM
非常感谢你


更新以下第一个答案

上面第一个答案中的代码与上面作为示例数据列出的特定日期/时间顺序完美配合。但不幸的是,我还有一个案子需要处理。这两个案例是:

案例1。应替换EndDateTime以避免重叠。 这个案例与我之前所问的相同

原始数据如下所示:

StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 12:30PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
2018-09-17 02:00PM     2018-09-17 03:00PM  
2018-09-17 03:00PM     2018-09-17 0:00PM
StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 12:30PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 12:30PM      * Overlap
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
我想得到这个:

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 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 
在这种情况下,应该修改EndDateTime

案例2。起始日期需要确定。 原始数据如下所示:

StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 12:30PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
2018-09-17 02:00PM     2018-09-17 03:00PM  
2018-09-17 03:00PM     2018-09-17 0:00PM
StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 12:30PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
StartDateTime           EndDateTime
2018-09-17 11:00AM     2018-09-17 12:00PM
2018-09-17 12:00PM     2018-09-17 12:30PM      * Overlap
2018-09-17 12:00PM     2018-09-17 01:00PM      * Overlap
2018-09-17 01:00PM     2018-09-17 02:00PM 
我想得到这个:

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 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 
在这种情况下,StartDateTime应该是固定的

我为混乱的数据道歉,但我不能真正操纵原始数据本身,我真的被困在这里了。我试图在上面的原始解决方案中添加另一个CASE-WHEN子句,但没有成功。是否有任何方法可以捕获这两种情况?

您可以使用将下一个“StartDateTime”获取到当前行,并将其用于进一步处理

然后可以将下一个StartDateTime与此行的EndDateTime进行比较。。。如果下一行在此行的EndDateTime之前开始,则将此行的EndDateTime修改为下一行的StartDateTime

CREATE TABLE #Test (StartDateTime datetime, EndDateTime datetime);
INSERT INTO #Test (StartDatetime, EndDateTime) VALUES
('2018-09-17 11:00AM',  '2018-09-17 12:00PM'),
('2018-09-17 12:00PM',  '2018-09-17 01:00PM'),  --   * Overlap
('2018-09-17 12:30PM',  '2018-09-17 01:00PM'),  --   * Overlap
('2018-09-17 01:00PM',  '2018-09-17 02:00PM'),
('2018-09-17 02:00PM',  '2018-09-17 03:00PM'), 
('2018-09-17 03:00PM',  '2018-09-17 04:00PM');  --   Note I changed end to 4:00pm

WITH DateTimeList AS
    (SELECT StartDateTime, 
            EndDateTime, 
            LEAD(StartDateTime,1) OVER (ORDER BY StartDatetime, EndDateTime) AS Next_StartTime
      FROM  #Test)
SELECT  StartDateTime, 
        CASE WHEN EndDateTime > Next_StartTime THEN Next_StartTime 
             ELSE EndDateTime END AS EndDateTime
  FROM  DateTimeList;

结果:

StartDateTime     EndDateTime
2018-09-17 11:00  2018-09-17 12:00
2018-09-17 12:00  2018-09-17 12:30
2018-09-17 12:30  2018-09-17 13:00
2018-09-17 13:00  2018-09-17 14:00
2018-09-17 14:00  2018-09-17 15:00
2018-09-17 15:00  2018-09-17 16:00
请注意,这假定重叠位于一行的末尾和下一行的开始(或全部),并修改当前行以适应下一行

CREATE TABLE #Test (StartDateTime datetime, EndDateTime datetime);
INSERT INTO #Test (StartDatetime, EndDateTime) VALUES
('2018-09-17 11:00AM',  '2018-09-17 12:00PM'),
('2018-09-17 12:00PM',  '2018-09-17 01:00PM'),  --   * Overlap
('2018-09-17 12:30PM',  '2018-09-17 01:00PM'),  --   * Overlap
('2018-09-17 01:00PM',  '2018-09-17 02:00PM'),
('2018-09-17 02:00PM',  '2018-09-17 03:00PM'), 
('2018-09-17 03:00PM',  '2018-09-17 04:00PM');  --   Note I changed end to 4:00pm

WITH DateTimeList AS
    (SELECT StartDateTime, 
            EndDateTime, 
            LEAD(StartDateTime,1) OVER (ORDER BY StartDatetime, EndDateTime) AS Next_StartTime
      FROM  #Test)
SELECT  StartDateTime, 
        CASE WHEN EndDateTime > Next_StartTime THEN Next_StartTime 
             ELSE EndDateTime END AS EndDateTime
  FROM  DateTimeList;

但是,如果(例如),您的两个重叠值是
12:00到12:30
12:00到1:00
然后第一个将被修改为从
12:00到12:00
,第二个将按原样保留。

感谢您的帮助,但此代码给了我一些其他东西。它替换StartDateTime和EndDateTime,即使它们不重叠。例如,如果我使用代码,我会得到这样的结果(2018-09-17 11:00 2018-09-17 11:00/2018-09-17 12:00 2018-09-17 12:00/等等),似乎startdatetime只是简单地替换enddatetime。我认为这是不对的@alexsmith5123。下面是一个带有上面代码的示例。就我所见,它产生的结果与您预期的输出完全相同(当然,最后一行0:00pm不存在-我改为4:00pm)。嗨,我已经找到了为什么我一直遇到错误的原因。这不是因为您的代码,而是因为我的数据集本身。我刚刚发现有两个不同的实例需要稍微不同的修改。我在下面写了更多的细节。我真的一整天都在做这个部分,任何帮助都将不胜感激。你知道有什么办法可以解决我下面列出的问题吗?再次非常感谢你。