2016-06-09 70 views
2

我正在研究應該在兩個日期之間找到午餐時間的查詢。例如, 午餐時間爲14:00 PM至15:30 PM。 ,日期爲:'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 

但是我還沒有做到這一點:(

+0

請告訴我們你試過了什麼。 – gofr1

+0

我寫了一段時間給'@ date1'增加了幾分鐘,然後進入'@ date2',每次檢查TIME是否在開始午餐時間和結束午餐時間之間,如果它是真的,'@ CountedLunches'會增加,但是a以防止雙倍增加午餐 –

回答

1

根據您的要求試試這個,讓tweeks:

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 
+0

感謝您的答案,但您正在使用DATEPART(小時,...) 和什麼約分鐘?! –

+0

編輯了分鐘考慮的答案:) –

+0

再次感謝你,我改變了它,它的工作,再次感謝你 –

4

這似乎工作:

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 

如果我們使用兩個CTE來(a)導出所有相關日期,和(b)從日期開始,計算所有可能的午餐時間,最後才找到重疊的所有午餐原始時期。

結果:

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 

注 - 很多人過分複雜化試圖找出重疊的定義。我在這裏使用了一個簡單的定義,通常唯一可能需要更改的是決定是使用<還是<=,這取決於您是否考慮兩個時間段,即鄰接,但其他時間段不包括相同的時間段重疊。

所以在這裏,你可能要改變的定義,如果你不滿意,當你查詢時間上面的查詢產生的答案是正好15:30或年底在整整14開始: 00。

+0

感謝您的正確答案和您的描述,但我只能選擇一個答案作爲正確的答案。 –

相關問題