2013-10-28 20 views
1

您好我有3柱(名 - 從 - 到)
和數據類型時間(7)
我插入3換檔
SHIFT1從8時零零分00秒到15時00 :從22:00:00 00
SHIFT2從15:00:00至22:00:00
shift3到08:00:00
和我有創建SP來檢查的什麼現在是轉向 這是SP轉換時間在我的表SQL

create PROC SelectShift 

AS 
DECLARE @TimeNow TIME = substring(convert(varchar(20), GetDate(), 9), 13, 5) 
+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2) 

SELECT s.Shift_Name, s.Id FROM Schedule s 
WHERE @TimeNow BETWEEN s.ShiftTime_From AND s.ShiftTime_To 


它做工精細移位1,2
但在移3它選擇空(現在時間22:55:00.0000000)
我不使用SQL時間,因此之前u能幫助

回答

1

我首先想到的是要將每個時間間隔轉換爲從00:00:00開始並將當前時間移動相同的量,但不支持減去時間。所以我最終使用了兩種情況。

這可能是一個表值函數,而不是一個進程,這可能使組成它eaiser:

Create Proc ShiftForTime @time time as 
Select 
    * 
From 
    schedule 
Where (
     ShiftTime_From < ShiftTime_To and 
     @time >= ShiftTime_From and 
     @time < ShiftTime_To 
    ) or (
     ShiftTime_From > ShiftTime_To and (
      @time >= ShiftTime_From or 
      @time < ShiftTime_To 
     ) 
    ) 
Go 
Create Proc SelectShift As 
Declare @now time = getdate() 
Exec ShiftForTime @now 

下面是一個使用表值函數的例子,和一羣不同的測試:

Example SQLFiddle

只是爲了知識的好奇心,我首先想到的,可向工作,儘管它migh噸效率較低

Create Proc ShiftForTime2 @time time as 
Select 
    * 
From 
    schedule 
Where 
    dateadd(second, datediff(second, ShiftTime_From, 0), @time) 
     < dateadd(second, datediff(second, ShiftTime_From, 0), ShiftTime_To) 
+0

日Thnx我現在就試試吧 –

1

你所得到的結果是正確的,因爲沒有辦法爲時間變量,以確定是否換檔的開頭是前一天(即00:00:00之前)或之後。

您可以解決此通過使用下面的方法,但它是很醜陋的編碼。

DECLARE @TimeNow TIME = '22:55:00.0000000' 

-- substring(convert(varchar(20), GetDate(), 9), 13, 5) 
--+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2) 


SELECT s.Shift_Name FROM #Schedule s 
WHERE @TimeNow BETWEEN s.ShiftTime_From AND (CASE WHEN s.ShiftTime_From > s.ShiftTime_To THEN '23:59:59' ELSE s.ShiftTime_To END)