1

さまざまなトランザクションをタイムスロットにグループ化する必要があるという次の問題があります。エントリdatetimestampを含むレコードを含むテーブルがあるとします。これらのレコードは、さまざまなシフトで働くユーザー(オペレーター)によって作成されます

シフト1:5-13h // シフト2:13-21h // シフト3:21-5h

ここで、タイムスタンプをシフトの開始時刻に切り捨てる柔軟なクエリが必要です。例:

2010-09-08 06:12:00.000 --> 2010-09-08 05:00:00.000
2010-09-08 02:12:00.000 --> 2010-09-07 21:00:00.000

dateaddとdatediffを使用していくつかのクエリを試しましたが、機能しません...誰か助けてもらえますか?ありがとう

4

4 に答える 4

1
select
case 
  when datepart(hh, start_date) between 5 and 12
       then dateadd(hh, 5, dateadd(d, datediff(d, 0, start_date), 0))
  when datepart(hh, start_date) between 13 and 20
       then dateadd(hh, 13, dateadd(d, datediff(d, 0, start_date), 0))
  when datepart(hh, start_date) between 21 and 23
       then dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date), 0))
  else dateadd(hh, 21, dateadd(d, datediff(d, 0, start_date)-1, 0))
end
from ...
于 2010-09-08T11:32:48.253 に答える
0
select 
    case
        --shift I   
        when datepart(HH, [TimeStamp]) >= 5 and datepart(HH, [TimeStamp]) < 13 then
            dateadd(HH, 5, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
        --shift II
        when datepart(HH, [TimeStamp]) >= 13 and datepart(HH, [TimeStamp]) < 21 then
            dateadd(HH, 13, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
        --shift III
        when datepart(HH, [TimeStamp]) >= 21 then               
            dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])))
        when datepart(HH, [TimeStamp]) < 5 then         
            dateadd(HH, 21, dateadd(dd,0, datediff(dd,0,[TimeStamp])-1))                            
    end as StartTime
from 
    Table1
于 2010-09-08T11:51:55.663 に答える
0

データベースがINTERVALタイプをサポートしている場合は、イベントのタイムスタンプから5時間を引いて、0500ではなく深夜を基準にして並べ、時間部分を8時間で割って、ゼロからインデックス付けされたシフト番号を取得します。

シフトの開始時刻を取得するには、シフト番号に8時間を掛け、それを上記の減算の日付部分に追加してから、さらに5時間を追加して、シフトスケジュールに合わせます。

これらを頻繁にクエリする場合は、IDとその開始時刻によって各シフトを個別に識別する2番目のテーブルを作成する方がよい場合があります。次に、イベントを含むテーブルでON INSERTトリガーを使用してシフトテーブルにデータを入力します。このトリガーは、計算を1回実行し、必要に応じてシフトのテーブルに新しい行を挿入し、外部キーを使用してイベント行をそれに関連付けます。これにより、特定のシフト中に発生したすべてのイベントを照会するためのはるかに簡単な方法も提供されます。

于 2010-09-08T11:57:13.563 に答える
-2

これはどう...?

select 
    case
        when datepart(Hh, dt) >= 5 AND datepart(Hh, dt) < 13 then 1
        when datepart(Hh, dt) >= 13 AND datepart(Hh, dt) < 21 then 2
        when datepart(Hh, dt) < 5 OR datepart(Hh, dt) >= 21 then 3
    end
from myTable
于 2010-09-08T11:25:30.270 に答える