如何检查SQL Server 2012中是否已存在给定的时隙

时间:2017-01-05 07:19:29

标签: c# asp.net sql-server datetime

我想在SQLServer 2012中检查给定的开始时间和结束时间是否在开始时间和结束时间之间。

案例:我有一个表,它有两列开始时间和结束时间有两行,请看下面那是我的表

StartTime | EndTime

10:00:00  | 17:00:00 

17:30:00  | 18:30:00

案例1 :鉴于开始时间为< 10:05:00'结束时间是< 16:00:00'然后它应该返回< 10:00:00'和 00:00'。

案例2 :给定的开始时间为09:05:00'结束时间是< 16:00:00'然后它应该返回< 10:00:00'和 00:00'。

案例3 :考虑到开始时间是< 09:05:00'结束时间是' 15:00'然后它应该返回< 10:00:00'和 00:00'。

案例4 :鉴于开始时间是' 05:05:00'结束时间是' 15:00'然后它应该返回< 10:00:00'和 00:00'。

案例5 :鉴于开始时间为< 10:05:00'结束时间是' 15:00'然后它应该返回< 10:00:00'和 00:00'。

案例6 :鉴于开始时间为< 17:00:00'结束时间是' 30:00'然后它不应该返回任何东西。

1 个答案:

答案 0 :(得分:2)

所以你想要返回与参数描述的时间段重叠的记录,对吧? 嗯,这是一种方法:

创建并填充样本表(在将来的问题中保存此步骤)

DECLARE @T as Table
(
    StartTime time,
    EndTime time
)

INSERT INTO @T VALUES
('10:00:00', '17:00:00'),
('17:30:00', '18:30:00')

声明并填充查询变量:

DECLARE @StartTime time, @EndTime time

SELECT  @StartTime = '23:05:00', 
        @EndTime = '17:00:00'

查询:

SELECT *
FROM @T 
WHERE 
(
    StartTime < @EndTime
    AND EndTime > CASE WHEN @StartTime > @EndTime THEN '00:00:00' ELSE @StartTime END
)
OR
(
    -- both periods must overlap since they both include '00:00:00'     
    @StartTime > @EndTime
    AND StartTime > EndTime
)
OR
(
    @StartTime < @EndTime
    AND StartTime > EndTime
    AND EndTime > @StartTime        
)

结果:

StartTime   EndTime
10:00:00    17:00:00

注意:我已考虑到时间段可能包括两个不同的日期。