2016-06-13 64 views
1

我正在尋找一種優雅的方式來選擇落在開始和結束時間之間的記錄。SQL Server之間的時間

我有一個datetime字段,它包含記錄的日期和時間。我可以通過CAST(fieldname as time)獲得時間。如果你正在尋找一個22:00,03:00

之間發生記錄我非常希望在WHERE子句中使用CASE

CASE 
    WHEN @Start < @End THEN CAST(fieldname as time) BETWEEN @Start AND @END 
    ELSE (CAST(fieldname as time) > @Start OR CAST(fieldname as time) < @End) 
END 

任何sugestions

一個BETWEEN不起作用我如何以一種簡單的方式來做到這一點。

感謝

+0

其實'BETWEEN'應該是你使用的是什麼IMO。如果你還有與那些時間相關的日期,那麼「BETWEEN」會按你想要的做。 –

+0

不,我該如何得到在開始和結束時間之間發生的所有結果,無論日期如何? –

+0

http://stackoverflow.com/questions/9840170/select-statement-filtering-by-time-of-day –

回答

1

優雅的方式:

SELECT *, CAST(datetimeFiled as time) 
FROM #Test 
WHERE 
    (@Start < @End AND (@Start < CAST(datetimeFiled as time) AND CAST(datetimeFiled as time) < @End)) 
    OR 
    (@Start > @End AND (@Start < CAST(datetimeFiled as time) OR CAST(datetimeFiled as time) < @End)) 

CASE WHEN方式:

SELECT *, CAST(datetimeFiled as time), 
    (CASE WHEN @Start < @End THEN 0 WHEN @Start > @End THEN 1 END) 
FROM #Test 
WHERE 1 = (
     CASE 
      WHEN @Start < @End THEN (SELECT 1 WHERE (@Start < CAST(datetimeFiled as time) AND CAST(datetimeFiled as time) < @End)) 
      WHEN @Start > @End THEN (SELECT 1 WHERE (@Start < CAST(datetimeFiled as time) OR CAST(datetimeFiled as time) < @End)) 
     END) 

的樣本數據:

CREATE TABLE #Test(datetimeFiled DATETIME) 
INSERT INTO #Test 
VALUES 
('2016-06-13 13:11:00'), 
('2016-06-12 23:11:00'), 
('2016-06-12 23:00:00'), 
('2016-06-13 14:00:00') 

DECLARE @Start TIME, @End TIME 
SET @Start = '23:01:00' 
SET @End = '13:25:00' 

您可以更改<至< =和> to> =使其包含在內。

1

解決方案的想法是將時間移到同一天。它看起來像這樣:

declare @startTime time='22:00' 
     ,@endTime time='2:00' 
     ,@shift int 
select @shift= case when @startTime>@endTime then DATEDIFF(ss,@startTime,'23:59:59')+ 1 
       else 0 end 

select cast(dateField as time) timeField, something 
from table1 
where dateadd(ss,@shift, cast(dateField as time)) between 
    dateadd(ss,@shift,@startTime) and dateadd(ss,@shift,@endTime) 

或者,如果你想在一個查詢:

declare @startTime time='22:00' 
     ,@endTime time='2:00' 

;with s as (
select case when @startTime>@endTime then DATEDIFF(ss,@startTime,'23:59:59')+ 1 
       else 0 end shift 
) 
select cast(dateField as time) timeField, something 
from table1 cross join s 
where dateadd(ss,s.shift, cast(dateField as time)) between 
    dateadd(ss,s.shift,@startTime) and dateadd(ss,s.shift,@endTime) 
+0

我的兩分錢:第一個查詢可以通過預先「移動」@startTime和@endTime變量來進一步改善,這樣'WHERE'看起來更清潔一些。 – Alex