2017-09-26 101 views
0

我在我的數據庫得到這個數據正確的if語句,並在這種情況下,在SQL Server

id  shift_no time_in time_out 
--------------------------------------- 
1  Shift 1  06:00:00 14:00:00 
2  Shift 2  14:00:00 22:00:00 
3  Shift 3  22:00:00 06:00:00 

所以我得到了這個日期:

convert(time(0),dateadd(HOUR, 15, getdate()), 108) 

我想只得到轉變,是這個時間轉換的範圍內(時間(0),DATEADD(HOUR,15,GETDATE()),108)

回答

1

對不起,我不能評論還有尚未...這是Tanner回答的評論。

你可以嘗試分裂3班次項:

INSERT INTO #shifts 
(
    shiftNo, 
    time_In, 
    time_Out 
) 
VALUES 
(1, '06:00:00', '14:00:00'), 
(2, '14:00:00', '22:00:00'), 
(3, '22:00:00', '23:59:59'), 
(3, '00:00:00', '06:00:00'); 

-- the selected time 
SELECT CONVERT(TIME(0), DATEADD(HOUR, 15, GETDATE()), 108); 

-- filter your shifts 
SELECT * 
FROM #shifts AS s 
WHERE CONVERT(TIME(0), DATEADD(HOUR, -6, GETDATE()), 108) 
BETWEEN s.time_In AND s.time_Out; 

DROP TABLE #shifts; 
+0

我可以嘗試這件事情,這將是好的!謝謝:) – GGw

+0

這可能會工作,但取決於高度緊密,你的源數據必然會出現這些變化,看起來像是你可以解決的問題的解決方法。我稍後再試 – Tanner

0
select 

* 

from yourtable 

where 
time_in between getdate() and convert(time(0),dateadd(HOUR, 15, getdate()), 108) 
or time_out between getdate() and convert(time(0),dateadd(HOUR, 15, getdate()), 108) 
+0

注意,您的時間返回值6時52分55秒。所以不確定'這次的範圍'是什麼意思,所以我已經猜到你是指現在和之後的時間。 – Cloud

+0

我們不能使用getdate(),因爲它返回datetime,而我得到的時間是時間(0) – GGw

1

可以使用BETWEEN與您的進出時間,像這樣(注意下面的重新運行的):在查詢工作了

CREATE TABLE #shifts 
(
    shiftNo INT, 
    time_In TIME(0), 
    time_Out TIME(0) 
); 

INSERT INTO #shifts 
(
    shiftNo, 
    time_In, 
    time_Out 
) 
VALUES 
(1, '06:00:00', '14:00:00'), 
(2, '14:00:00', '22:00:00'), 
(3, '22:00:00', '06:00:00'); 

-- the selected time 
DECLARE @selectedTime TIME(0) = CONVERT(TIME(0), DATEADD(HOUR, 12, GETDATE()), 108); 

-- modify the selected time if it falls in the shift that crosses midnight 
SET @selectedTime = CASE WHEN @selectedTime > '22:00:00' OR @selectedTime < '06:00:00' 
         THEN '22:01:00' -- modified value 
         ELSE @selectedTime -- regular value 
        END; 
-- show the time we are working with 
SELECT @selectedTime; 

-- filter your shifts 
SELECT * 
FROM #shifts AS s 
WHERE @selectedTime 
BETWEEN s.time_In AND CASE WHEN s.time_Out = '06:00:00' -- is the out time 6.00 
          THEN '23:59:59' -- change it to before midnight if so 
          ELSE s.time_Out -- keep the time as it is 
         END; 

DROP TABLE #shifts; 

CASE語句,如果你是@selectedTime工作時間是將s.time_Out之前跨越午夜時間它們都被調整,這允許選擇最後一班。

有可能是一個更簡單的解決方案,但這與您提供的數據一起工作。

+0

我不知道爲什麼先生,但它不返回任何值:我現在的時間是:22:58:37所以它應該在裏面Shift 3但它不返回任何值 – GGw

+0

它爲我做的... – PawelCz

+0

它雖然沒有爲我:( – GGw