2012-09-28 57 views
4

我的一個項目中的sql查詢有一個問題。實際上,我必須在某個表中檢查一個DateTime列,並且有三個班次,即,我必須根據正在落在相應班次中的RegisteredDateTime列獲取記錄。我們有以下換擋時機,移位將在24種小時格式在sql服務器查詢中移位明智的日期時間檢查

Shift1 : 07:00:00-12:00:00 
Shift2 : 12:00:00-22:00:00 
Shift3 : 22:00:00-07:00:00 

我的問題是我正確地得到記錄和SHIFT1 SHIFT2,但沒有記錄就在於shift3。我正在輪到,解決這個問題。我使用下面的搜索查詢在上面的查詢用於SHIFT1的所有班次

SELECT  RequestNumber 
FROM   Table 
WHERE (CONVERT(Time, RegisteredDateTime) BETWEEN '" & Shift1.Split("-")(0) &"' AND ' " & Shift1.Split("-")(1) & "') 

獲取的記錄,同樣我檢查SHIFT2和Shift3也。

您好每一個,最後由@ An​​andPhadke給出的主意工作對我來說,它的最終查詢我使用

Dim StartNumber As Integer = Convert.ToInt32(Shft3Arr(1).Split(":")(0)) 
Dim EndShift As String = (StartNumber - 1) & ":59:59" 
query += "(CONVERT(Time, Complaints.RegisteredDateTime) >= '" + Shft3Arr(0) + "') OR (CONVERT 
(Time, DATEADD(DD, 1, Complaints.RegisteredDateTime)) <= '" + EndShift + "')" 
+0

可以更改架構,以便你存儲移位開始和持續時間轉移?這將是更合乎邏輯的imo。 – tenfour

回答

2

使用這些條件:

對於SHIFT1

WHERE CONVERT(Time, RegisteredDateTime) > convert(time,'07:00:00') and CONVERT(Time, RegisteredDateTime) <= convert(time,'12:00:00') 

對於SHIFT2

WHERE CONVERT(Time, RegisteredDateTime) > convert(time,'12:00:00') and CONVERT(Time, RegisteredDateTime) <= convert(time,'22:00:00') 

對於shift3

WHERE CONVERT(Time,RegisteredDateTime) > convert(time,'22:00:00') and CONVERT(Time, DATEADD(DD,1,RegisteredDateTime)) <= convert(time,'06:59:59') 
+0

@ AnandPhandke,我試着用你提供的查詢條件,但沒有運氣。 –

+0

這裏會有什麼註冊日期?我的意思是它會變成getdate()? – AnandPhadke

+0

請檢查更新的查詢 – AnandPhadke

2

移位3跨越2天跨度..

添加這些您查詢條件也

AND CONVERT(Time,DATEADD(DD,1,RegisteredDateTime)) < '07:00:00' 
AND CONVERT(Time,RegisteredDateTime) > '07:00:00' 
AND DATEDIFF(DD,CONVERT(DATE,RegisteredDateTime), 
      CONVERT(Date,DATEADD(DD,1,RegisteredDateTime))) <=1 

這個答案是基於理查德aka cyberkiwi答案上面。充分的榮譽歸功於他。 請接受他的答案,如果這是爲你工作..

您的位移數據是這樣的:

Shift1 : 07:00:00-12:00:00 
Shift2 : 12:00:00-22:00:00 
Shift3 : 22:00:00-07:00:00 

你需要做的僅僅是設置基於換檔時間@shift_start_time和@shift_end_time什麼

declare @shift_start_time time ; 
declare @shift_end_time time; 

IF shift 1: 
select @shift_start_time ='00:00:00' 
select @shift_end_time ='04:59:59' 

IF shift 2: 
select @shift_start_time ='05:00:00' 
select @shift_end_time ='14:59:59' 

IF shift 3: 
select @shift_start_time ='15:00:00' 
select @shift_end_time ='23:59:59' 

SELECT RegisteredDateTime 
FROM t_shift 
WHERE CONVERT(Time, DateAdd(hh,-7, RegisteredDateTime)) 
     between @shift_start_time and @shift_end_time 
+0

@ Joe,我追加了你給出的條件以及我的條件,但是查詢沒有返回任何結果。 –

+0

@SaiKalyanAkshinthala:請檢查更新的答案 –

4

的最簡單的事情做的,是要SHIFT時代(雙關語意)!

你的時間是7-12,12-22,22-7 *(7 *爲次日)

使用的只是一點點移他們0-5,5-15,15-24魔術,這將匹配你測試的日期範圍是start of the shift,對嗎?

SELECT RequestNumber 
FROM Table 
WHERE DateAdd(hh,-7,CONVERT(Time, RegisteredDateTime)) 
     BETWEEN .... 

雖然在邏輯上不錯,但不是SARGABLE,所以我們改變範圍,反之,相反的方式。

SELECT RequestNumber 
FROM Table 
WHERE CONVERT(Time, RegisteredDateTime) 
     BETWEEN DateAdd(hh,7,@date1) AND DateAdd(hh,7,@date2) 
+0

@理查德,我不能改變那樣的轉變。我們已經給出了我們客戶的換班時間,換班是根據他們的工作時間。 –

+0

你完全錯過了這一點。通過比較時間來「轉移」時間。在WHERE子句中增加-7小時可以有效地「移動」它們,因爲爲了與日期範圍進行比較,調整後的7-9變爲0-2。 – RichardTheKiwi

+0

對不起,@理查德。你能幫我解決這個問題嗎?你給出的查詢是一些很難理解的東西。到目前爲止,我已經解決了許多關於日期和時間的問題,但是這使我失敗了。 –

1

如果您不是在檢索resutls輪班1所面臨的任何問題,並快步2然後再從移位3結果只是全集減去第一組2個的查詢結果。所以說,查詢1對1轉變和查詢2是變速2:那麼你對於移位3組得到結果查詢將是:

select resuestNumber from table where requestNumber not in (query 1) and requestNumber not in(query 2)