← 所有文章

FIELD NOTES / 資料記錄與報表

跨時區設備的班次產量如何轉換後再彙總

資料記錄與報表作者:站長預估 5 分鐘閱讀

先定義全球時窗或地方班別,再以UTC端點配對事件,避免跨日與偏移造成產量錯班。

本文目錄

先決定是同一時段還是各廠同名班別

跨國工廠都寫白班,並不代表它們同時上班。做總部報表前,先決定要比較同一個絕對時間窗的產量,還是各廠當地白班的產量。這兩種彙總都可能有用,但時間範圍不同,不能只把白班名稱相同的列直接相加。

準備廠區識別、所在地時區、當地班表、班別生效版本與事件時間。日期與時分不足以表示全球唯一時刻;還需要正確的時區或當時偏移。若設備只回傳無時區字串,必須先確認來源約定,不可使用接收電腦的設定自行猜測。

本篇以固定偏移的教學案例說明算式,實際地區時區要由可信的時區資料處理。UTC是共同時間基準,當地日期與班別是業務分類;保存兩者及轉換依據,可以兼顧排序與現場閱讀。

適用於事件時間可信、班表範圍明確的工業報表。若資料源時鐘不準、事件只剩日期或班別臨時更改,先補資料品質與版本,時區轉換不能修復未知的原始時間。

把當地班別端點轉成UTC

假設甲廠當日使用UTC加八,白班為當地八時到二十時,轉成UTC就是當日零時到十二時。乙廠當日使用UTC加九,同樣的當地白班則是前一日二十三時到當日十一時。兩個同名白班的絕對時間窗相差一小時。

若總部要比較UTC零時到十二時,甲廠剛好是當地八時至二十時,乙廠則是九時至二十一時。乙廠的這個窗口跨過其白班終點,所以不能直接拿乙廠整班總數代替,應從事件明細按共同時間窗重算。

若總部要比較各地白班,就各自先依當地班表取得UTC起訖,再統計事件。摘要保留廠區、當地班日、班別名稱、UTC起訖及時區,讓讀者看得出「同名班別比較」並不是「同時段比較」。

時間篩選採起點包含、終點不包含。甲廠UTC十二時整的事件屬下一班,不再算進白班;乙廠UTC十一時整也同理。不要把端點先截成日期再比較,這會把跨日班次切錯。

完成這組例子,先手算兩廠各一筆接近交界的事件,再與程式輸出比對。若連端點都對不上,先修轉換,不能用調整總數的方式掩蓋問題。

日期跨越與夜班歸屬另有規則

班表異動需有生效區間。若月底改成七時換班,歷史報表仍按當時班表計算,不能讓新班表回頭重分舊產量而沒有修訂紀錄。將事件對到班次時,同時記下採用哪個班表版本。

夜班可能從當地二十時到隔日八時。班日可約定用開班日,因此翌日清晨完成的產品仍歸前一班日。這是業務命名規則,不是UTC日期;必須由班表明確定義,避免每天午夜把同一班拆成兩班。

例:甲廠九月二十日二十時至二十一日八時,使用UTC加八時,對應UTC二十日十二時至二十一日零時。當地二十一日零時三十分的事件,對應UTC二十日十六時三十分,屬二十日開班的夜班。

若單純依事件的當地日期分組,清晨資料會被歸到二十一日,與按開班日的班報不一致。先透過班表區間找班次識別,再按班次彙總;不要靠小時小於八就一律減一天,因為換班時間可能因廠區或歷史版本不同。

同一事件應只配到一個有效班次,除非業務明確允許重疊分類。檢查班表是否有空隙或重疊,跨午夜與停班日期尤其重要。配不到班表時標待判定,不擅自塞進最近一班。

儲存時保留足以重算的資訊

廠區時區是資料模型的一部分,不應從使用者瀏覽器所在地推定。人在出差時開同一份正式班報,結果應維持指定廠區規則;個人顯示時間可另外提供,但不要改變正式彙總。

PostgreSQL 18的帶時區時間戳會轉成UTC保存,輸出受目前時區設定影響,原輸入的地區時區不會自動保留下來。若需要重現當地班表解釋,另外保留廠區時區名稱、原始時間及必要版本,不依賴單一欄位承擔所有語意。

地區時區名稱與固定偏移不同。偏移描述某一時刻相差幾小時,地區規則可能隨日期改變。不能用今天的偏移去轉去年所有紀錄,也不要只寫容易歧義的縮寫。涉及歷史或未來排程時,保存所用時區資料與班表版本。

彙總前核對計數單位與產品範圍。時區轉換正確,不代表不同工廠的箱數、件數或加工次數可直接相加。總部的統一指標需另有定義,原始地方指標保留,避免轉換後失去比較基礎。

完成後用同一份UTC事件資料,分別產出共同時窗與地方班別兩張表,核對每張明細到摘要的件數一致。變更顯示時區不應改變事件總數,只改變它們被歸入的業務區間。

失敗時先查時間字串是否被轉換兩次。原本已是UTC卻再次扣八小時,或原本無時區卻被資料庫默認為伺服器時區,都是常見偏移來源。保存匯入前後一筆完整值,可比盯著整班差額更快定位。

練習與常見問題

練習:UTC九月二十日十一時三十分的一件產品,在本例甲廠與乙廠各是幾點?甲廠十九時三十分仍在白班;乙廠二十時三十分已在夜班。若報表按各地白班,這兩件不會因UTC時間相同就歸同名班別。

再練習:將甲廠夜班結束UTC零時整的事件歸班。依半開區間,它歸下一個班次,而非前一夜班。測試資料應同時包含端點前、等於端點及端點後,才容易抓出比較符號錯誤。

問:全部存UTC就不用班表嗎?答:UTC解決共同時間基準,班別仍是地方業務規則。

問:時區名稱和加八一樣嗎?答:固定偏移只描述差值,地區規則可能隨日期不同。

問:夜班班日一定是開班日嗎?答:依公司定義,但必須固定且可追溯。

問:各地白班合計可當全球同時段產量嗎?答:不可,先確認需要哪一種時間範圍。

參考:PostgreSQL 18 Date/Time Types:帶時區時間戳的儲存、顯示及原時區資訊限制。

延伸閱讀