Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
表中任意ID之间的SQL时间输入和超时冲突_Sql_Sql Server_Sql Server 2008_Time_Between - Fatal编程技术网

表中任意ID之间的SQL时间输入和超时冲突

表中任意ID之间的SQL时间输入和超时冲突,sql,sql-server,sql-server-2008,time,between,Sql,Sql Server,Sql Server 2008,Time,Between,我试图在表中创建两个字段,显示一个视频的时间是否与另一个视频的时间冲突,以及哪个视频的时间冲突 样本数据: SELECT vid, timein, timeout FROM mytable vid timein timeout 1 2015-04-15 06:00:00.000 2015-04-16 17:00:00.000 2 2015-04-17 03:00:00.000 2015-04-17 18:00:00.000 3

我试图在表中创建两个字段,显示一个视频的时间是否与另一个视频的时间冲突,以及哪个视频的时间冲突

样本数据:

SELECT vid, timein, timeout
FROM mytable

vid timein                      timeout
1   2015-04-15 06:00:00.000     2015-04-16 17:00:00.000
2   2015-04-17 03:00:00.000     2015-04-17 18:00:00.000
3   2015-04-16 16:00:00.000     2015-04-17 06:00:00.000
4   2015-04-12 12:00:00.000     2015-04-12 22:00:00.000
5   2015-03-25 01:00:00.000     null
期望输出:

vid timein                      timeout                     Clash   Clashwith
1   2015-04-15 06:00:00.000     2015-04-16 17:00:00.000     CLASH   3
2   2015-04-17 03:00:00.000     2015-04-17 18:00:00.000     CLASH   3
3   2015-04-16 16:00:00.000     2015-04-17 06:00:00.000     CLASH   1, 2
4   2015-04-12 12:00:00.000     2015-04-12 22:00:00.000     OK
5   2015-03-25 01:00:00.000     null                        OK
我所尝试的:

SELECT vid, timein, timeout,
CASE WHEN (SELECT tin.timein 
           FROM mytable tin 
           WHERE tin.vid = mytable.vid 
           AND mytable.timeout IS NOT NULL) 
           BETWEEN mytable.timein AND mytable.timeout
     THEN 'CLASH' 
     ELSE 'OK' 
     END AS inclash,
CASE WHEN (SELECT tout.timeout 
           FROM mytable tout 
           WHERE tout.vid = mytable.vid 
           AND mytable.timeout IS NOT NULL) 
           BETWEEN mytable.timein AND mytable.timeout
     THEN 'CLASH' 
     ELSE 'OK' 
     END AS outclash
FROM mytable

这不起作用,因为它会对所有结果产生冲突,而且我也不知道如何编写列冲突。

您可以通过一个简单的应用来实现,要连接所有冲突ID,您可以使用xml技巧:

select
    t1.vid,
    t1.[timein],
    t1.[timeout],
    case when c.Clashwith is not null then 'CLASH' else 'OK' end as Clash,
    c.Clashwith
from mytable as t1
    outer apply (
        select
            stuff(
                (
                    select ',' + cast(t2.vid as nvarchar(max))
                    from mytable as t2
                    where
                        t2.vid <> t1.vid and
                        t2.[timein] <= t1.[timeout] and
                        t2.[timeout] >= t1.[timein]
                     for xml path(''), type
                ).value('.', 'nvarchar(max)')
            ,1,1,'') as Clashwith
    ) as c

你确定?它在您的测试示例上给出了完全相同的输出Hey@Matt现在这个代码显然是不正确的,或者部件没有检查自连接,例如。我将再次检查代码,请尝试查找我的代码不起作用的示例,我们将解决它。您还必须检查在该查询中应如何处理null。请不要编辑我的答案。