检查日期是否与同一表中的日期重叠

时间:2018-10-02 11:33:37

标签: sql datetime

下表显示了会话表中的3个选定行,其中包含同一天同一位医生的3个会话,但开始和结束时间不同。 我想更新该表中一行的sessionStartTime和sessionEndTime列,同时检查sessionStartTime和sessionEndTime是否与其他2行重叠。我需要的是对此正确的SQL查询。

例如,我要编辑id为1091的行的sessionStartTime为2018-07-08 9:30:00,sessionEndTime为2018-07-08 10:30:00并作为开始时间和结束时间该会话的时间与其他两个行值不重叠,这两个值应进行更新。但是如果我输入两个值,则sessionStartTime为2018-07-08 8:20:00和sessionEndTime为2018-07-08 9:00 id = 1091的:00,则不应允许它编辑该行,因为已经有另一个id = 1090的会话包含开始和结束时间段。

enter image description here

这是我已经尝试过的查询。

SELECT * 
FROM session 
WHERE (sessionDate='2018-07-08 00:00:00') 
  AND (userInfoId=420) 
  AND (   ('2018-07-08 9:30:00'BETWEEN sessionStartTime AND sessionEndTime) 
       OR ('2018-07-08 10:30:00'BETWEEN sessionStartTime AND sessionEndTime )
       OR (sessionStartTime BETWEEN '2018-07-08 9:30:00' AND '2018-07-08 10:30:00'));

1 个答案:

答案 0 :(得分:1)

显然,您正在尝试编写一个重叠查询,该查询比您想象的要简单得多。假设您要编辑行号1091,可以使用以下查询来确定所需的开始日期和结束日期是否与现有日期重叠:

DECLARE @d1 AS DATETIME = '2018-07-08 09:30:00'
DECLARE @d2 AS DATETIME = '2018-07-08 10:30:00'
SELECT *
FROM session
WHERE userInfoId = 420 -- really?
AND id <> 1091 -- a row always overlaps with itself
AND @d2 > sessionStartTime AND sessionEndTime > @d1 -- overlap test, exclusive end date

如果此查询返回一个或多个行,则您有重叠,否则没有重叠。将@d1@d2替换为日期时间文字,参数或变量。