表中的 id 之间的 SQL 时间和超时冲突

Posted

技术标签:

【中文标题】表中的 id 之间的 SQL 时间和超时冲突【英文标题】:SQL time in & time out ***es between any ids in table 【发布时间】:2015-04-20 09:36:41 【问题描述】:

我正在尝试在我的表中创建两个字段,以显示一个 vid 的时间是否与其他任何 vid 的时间冲突,以及哪个 vid 的冲突。

样本数据:

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                     ***   ***with
1   2015-04-15 06:00:00.000     2015-04-16 17:00:00.000     ***   3
2   2015-04-17 03:00:00.000     2015-04-17 18:00:00.000     ***   3
3   2015-04-16 16:00:00.000     2015-04-17 06:00:00.000     ***   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 '***' 
     ELSE 'OK' 
     END AS in***,
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 '***' 
     ELSE 'OK' 
     END AS out***
FROM mytable

这不起作用,因为它会给所有结果带来冲突,而且我也不知道如何与写入的列发生冲突。

【问题讨论】:

【参考方案1】:

你可以用一个简单的apply() 来做到这一点,并且你可以使用 xml 技巧来连接所有冲突的 id:

select
    t1.vid,
    t1.[timein],
    t1.[timeout],
    case when c.***with is not null then '***' else 'OK' end as ***,
    c.***with
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 ***with
    ) as c

sql fiddle demo

【讨论】:

你确定吗?它在您的测试示例中给出完全相同的输出 嘿@Matt 现在这段代码绝对不正确,例如or 部分没有检查自连接。我会再次检查代码,请尝试找到我的代码不起作用的示例,我们会解决它。 您还必须检查在此查询中应如何处理空值。请不要编辑我的答案。

以上是关于表中的 id 之间的 SQL 时间和超时冲突的主要内容,如果未能解决你的问题,请参考以下文章

处理 ClientInsertServerInsert 同步冲突时出现 SQL 命令“超时”异常

给出超时的简单 SQL 删除语句

Oracle使用左外连接时,左表中的一个id在右表(数据表以天为单位)中没有数据 使用nvl替换为0

SQL 过程超时

用于修复 .NET 应用程序以解决 SQL Server 超时问题并缩短执行时间的清单

火花 SQL 超时