3

当工場では以下のシフト制をとっております。

  • 1: 月 - 金: 午前 5 時 - 午後 1 時
  • 2: 月 - 金: 午後 1 時 - 午後 9 時
  • 3: 月 - 金: 午後 9 時 - 午前 5 時
  • 4a: 土: 午前 5 時~午後 5 時
  • 4b: 日: 午後 5 時 - 月 午前 5 時

特定のテーブルには、クエリを使用してグループ化したいいくつかの日時エントリがあります。シフト 1、2、3 の場合、このクエリは正常に機能します::

  CASE
WHEN DATEPART(hh, c.date_time_stamp) >= 5 AND DATEPART(hh, c.date_time_stamp) < 13 THEN CONVERT(VARCHAR(10), c.date_time_stamp, 103) + ' shift 1'
WHEN DATEPART(hh, c.date_time_stamp) >= 13 AND DATEPART(hh, c.date_time_stamp) < 21 THEN CONVERT(VARCHAR(10), c.date_time_stamp, 103) + ' shift 2'
WHEN DATEPART(hh, c.date_time_stamp) >= 21 AND DATEPART(hh, c.date_time_stamp) < 24 THEN CONVERT(VARCHAR(10), c.date_time_stamp, 103) + ' shift 3'
WHEN DATEPART(hh, c.date_time_stamp) >= 00 AND DATEPART(hh, c.date_time_stamp) < 5 THEN CONVERT(VARCHAR(10), DATEADD(DAY, -1, c.date_time_stamp), 103)  + ' shift 3'  END AS shift,

これにより、ある種の shift_id が得られます。シフト 4a と 4b を識別するために、case ステートメントを拡張できますが、クエリのパフォーマンスが少し心配です。

shift_id を効率的に返す関数を作成する方法を教えてもらえますか? ありがとうございました!

編集: いくつかのサンプル データ:

inventory_trans_number creation_dt             shift_id             shift_type container_code
---------------------- ----------------------- -------------------- ---------- ------------------
140952                 2013-02-04 01:03:19.043 20130203 03          3          154143591115247892
140956                 2013-02-04 01:07:20.343 20130203 03          3          154143591115247939
140962                 2013-02-04 01:10:56.417 20130203 03          3          154143591115247991
140968                 2013-02-04 01:14:55.250 20130203 03          3          154143591115248134
140970                 2013-02-04 01:17:18.883 20130203 03          3          154143591115248196
141070                 2013-02-04 02:12:59.327 20130203 03          3          154143591115248240
141076                 2013-02-04 02:16:27.480 20130203 03          3          154143591115248356
141092                 2013-02-04 02:22:44.067 20130203 03          3          154143591115248530
141096                 2013-02-04 02:25:02.157 20130203 03          3          154143591115248585
141102                 2013-02-04 02:33:51.253 20130203 03          3          154143591115248615
4

1 に答える 1

1

これはあなたにシフトを与えるでしょう。これは、データベースの問題ではなく、数学の問題であることを認識して機能します。

週に21のシフトがあり、シフト名を保持するテーブル変数を作成します。このために、[数値]列にインデックスを付けて永続テーブルを作成することをお勧めします。

関心のある日付の前DATEDIFFの月曜日の5:00に設定されている時刻と日時の間の時間を取得し、これを24 * 7(1週間の時間数)で法として取得します。月曜日の5:00を過ぎた時間を示す数値(つまり、シフト0)。これを8で割ると、シフト番号が得られます。

DECLARE @FirstEverShift datetime = CONVERT(datetime, '2011-12-26 05:00')

DECLARE @ShiftTypes TABLE
(Number int NOT NULL PRIMARY KEY,
 Shift  nvarchar(2) NOT NULL)

INSERT @ShiftTypes
VALUES
(0, '1'),
(1, '2'),
(2, '3'),
(3, '1'),
(4, '2'),
(5, '3'),
(6, '1'),
(7, '2'),
(8, '3'),
(9, '1'),
(10, '2'),
(11, '3'),
(12, '1'),
(13, '2'),
(14, '3'),
(15, '4a'),
(16, 'NA'),
(17, 'NA'),
(18, '4b'),
(19, 'NA'),
(20, 'NA')

SELECT  s.date_time_stamp
        ,st.Shift
FROM    shifts s
        INNER JOIN
        @ShiftTypes st ON st.Number=DATEDIFF(HOUR, @FirstEverShift, s.date_time_stamp) % (24*7) / 8

編集

週末のシフトは8時間ではなく12時間であることに気付きました。このアプローチは機能しますが、タブレットを使用しているため、変更する必要はありません。

8で割る代わりに、4で割るということは、テーブル変数が0から40になる必要があり、8時間のシフトごとに2つの数値がかかり、12時間ごとに3がかかることを意味します。

于 2013-02-05T03:50:54.627 に答える