Sql 查找两个日期之间的时间冲突

Sql 查找两个日期之间的时间冲突,sql,sql-server,Sql,Sql Server,我正在做一个查询,应该可以找到两次约会之间的午餐时间。 例如,午餐时间在下午14:00到15:30之间。 日期为:“2016-06-09 10:00:00.000”和“2016-06-11 10:00:00.000” 午餐时间在这两个日期之间发生两次。 还有另一个例子: '2016-06-09 15:00:00.000' and '2016-06-11 10:00:00.000' : 2 Times '2016-06-09 17:00:00.000' and '2016-06-11 10:00:

我正在做一个查询,应该可以找到两次约会之间的午餐时间。 例如,午餐时间在下午14:00到15:30之间。 日期为:“2016-06-09 10:00:00.000”和“2016-06-11 10:00:00.000” 午餐时间在这两个日期之间发生两次。 还有另一个例子:

'2016-06-09 15:00:00.000' and '2016-06-11 10:00:00.000' : 2 Times '2016-06-09 17:00:00.000' and '2016-06-11 10:00:00.000' : 1 Time '2016-06-09 13:00:00.000' and '2016-06-11 15:00:00.000' : 3 Times “2016-06-09 15:00:00.000”和“2016-06-11 10:00:00.000”:两次 “2016-06-09 17:00:00.000”和“2016-06-11 10:00:00.000”:1次 “2016-06-09 13:00:00.000”和“2016-06-11 15:00:00.000”:3次
但我永远也做不到:(

试试这个,根据你的要求做两个:

DECLARE @date1 DATETIME = '2016-06-09 08:30:00.000';
DECLARE @date2 DATETIME = '2016-06-13 18:00:00.000';
DECLARE @lunchStart DATETIME = '2016-06-13 14:00:00.000';
DECLARE @lunchEnd DATETIME = '2016-06-13 15:30:00.000';
DECLARE @output INT = 0;

SELECT @output = DATEDIFF(DAY, @date1, @date2)
IF DATEPART(HOUR, @date1) > DATEPART(HOUR, @lunchStart) OR (DATEPART(HOUR, @date1) = DATEPART(HOUR, @lunchStart) AND DATEPART(MINUTE, @date1) <= DATEPART(MINUTE, @lunchStart))
    SET @output = @output - 1

IF DATEPART(HOUR, @date2) < DATEPART(HOUR, @lunchEnd) OR (DATEPART(HOUR, @date2) = DATEPART(HOUR, @lunchEnd) AND DATEPART(MINUTE, @date2) = DATEPART(MINUTE, @lunchEnd))
    SET @output = @output - 1

PRINT @output
DECLARE@date1 DATETIME='2016-06-09 08:30:00.000';
声明@date2 DATETIME='2016-06-13 18:00:00.000';
声明@午餐开始日期时间='2016-06-13 14:00:00.000';
声明@午餐结束日期时间='2016-06-13 15:30:00.000';
声明@output INT=0;
选择@output=DATEDIFF(天、@date1、@date2)
如果DATEPART(HOUR,@date1)>DATEPART(HOUR,@午餐开始)或(DATEPART(HOUR,@date1)=DATEPART(HOUR,@午餐开始)和DATEPART(MINUTE,@date1)这似乎有效:

declare @t table (StartAt datetime not null,EndBefore datetime not null)
insert into @t(StartAt,EndBefore) values
('2016-06-09T15:00:00.000','2016-06-11T10:00:00.000'),
('2016-06-09T17:00:00.000','2016-06-11T10:00:00.000'),
('2016-06-09T13:00:00.000','2016-06-11T15:00:00.000')

;With Dates as (
    select MIN(DATEADD(day,DATEDIFF(day,0,StartAt),0)) as ADate
    from @t
    union all
    select DATEADD(day,1,ADate) from Dates
    where exists (select * from @t where EndBefore > DATEADD(day,1,ADate))
), Lunches as (
    select DATEADD(minute,(14*60),ADate) as StartAt,
           DATEADD(minute,(15*60+30),ADate) as EndBefore
    from Dates
)
select
    *,(select COUNT(*) from Lunches l
       where l.StartAt < t.EndBefore and t.StartAt < l.EndBefore)
from @t t

注意-许多人试图得出重叠的定义时过于复杂。我在这里使用的是一个简单的定义,通常唯一需要修改的是决定是否使用
,请告诉我们您尝试了什么。我写了一段时间,在
@date1
上加了几分钟,每次检查时转到
@date2
如果时间介于午餐开始时间和午餐结束时间之间,如果是真的,
@counted午餐
会增加,但会有一点变化以防止午餐双倍增加感谢您的回答,但您使用的是DATEPART(小时,…),那么分钟呢?!编辑答案也是为了分钟考虑:)再次感谢你,我改变了它,它工作了,再次感谢你的正确答案和你的描述,但我只能选择一个答案作为正确答案。
StartAt                 EndBefore               
----------------------- ----------------------- -----------
2016-06-09 15:00:00.000 2016-06-11 10:00:00.000 2
2016-06-09 17:00:00.000 2016-06-11 10:00:00.000 1
2016-06-09 13:00:00.000 2016-06-11 15:00:00.000 3