表中的 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 命令“超时”异常
Oracle使用左外连接时,左表中的一个id在右表(数据表以天为单位)中没有数据 使用nvl替换为0