4

プロジェクトの 1 つで、SQL クエリに問題が 1 つあります。実際には、3 つのシフトがあるテーブルで 1 つの DateTime 列をチェックする必要があります。つまり、それぞれのシフトに該当する RegisteredDateTime 列に基づいてレコードを取得する必要があります。次のシフト タイミングがあり、シフトは 24 時間形式になります。

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

私の問題は、シフト 1 とシフト 2 でレコードを正しく取得していることですが、レコードがシフト 3 にあるわけではありません。これを解決するために、私は回っています。次の検索クエリを使用して、すべてのシフトのレコードを取得しています

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

上記のクエリは Shift1 に使用されます。同様に、Shift2 と Shift3 もチェックしています。

こんにちは、最終的に@ AnandPhadkeによって与えられたアイデアが私のために働いた、それは私が使用している最終的なクエリです

 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 + "')"
4

4 に答える 4

4

ここで行う最も簡単なことは、時間をシフトすることです(しゃれを意図しています)!

あなたの時間は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)
于 2012-09-28T08:26:37.997 に答える
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

この回答は、上記のRichard 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
于 2012-09-28T08:14:12.297 に答える
2

Use these conditions:

For shift1

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

For shift2

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

For shift3

WHERE CONVERT(Time,RegisteredDateTime) > convert(time,'22:00:00') and CONVERT(Time,  DATEADD(DD,1,RegisteredDateTime)) <= convert(time,'06:59:59')
于 2012-09-28T08:16:52.717 に答える
1

シフト 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)
于 2012-09-28T12:07:50.863 に答える