2013-02-04 48 views
3

在我們的工廠,我們有如下的變化:集團時間戳輪班

  • 1:莫 - 週五:上午05時 - 下午1點
  • 2:莫 - 週五:下午1點 - 晚上9點
  • 3:莫 - 週五:晚上9點 - 凌晨5點
  • 4A:週六:上午05時 - 下午5時
  • 4B:孫:下午5點 - 上午05點週一

在某個表中,我們有幾個日期我想用查詢進行分組。對於移位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 
+1

如果你擔心性能,爲班次ID添加一個額外的列。既可以作爲具有持續值的計算列,也可以使用計算插入/更新時的班次ID的觸發器。把一個索引,完成。 – Tomalak

+0

感謝您的評論,我早些時候曾經想過,但它是一個外部數據庫表(它不是我們的,它是WMS系統的數據庫)... –

+0

@KoenVC給出了上面的示例數據,您期望什麼如果你運行假設函數的結果? – bonCodigo

回答

1

這會給你的變化。它意識到這是一個數學問題,而不是數據庫問題。

每週有21個班次,我們創建一個表格變量來保存班次名稱 - 您可能希望使用Number列上的索引爲此創建一個permenant表。

通過由被我們感興趣的日期的任何之前設置到5:00在星期一和利用這一模24 * 7的數量(時間和日期時間之間的時間得到一個DATEDIFF一週中的小時數),我們得到一個數字,表示星期一5點過去的時間(即班次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 

編輯

我意識到週末班有12個小時未8.這種方法的工作,但需要這我不打算這樣做,因爲我是在平板電腦上修改!

而是由8除以4分,這意味着該表變量從0到去40每8小時班需要2個號碼,每個12小時需要3

+0

嗨戴爾,我會試試看! –