跳至內容
Astera Technology

正午取貨為甚麼同時計入早更及午更?

時段由開始時間計入,結束時間不計,交界的取貨才只屬下一更。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

兩更在正午接續,每次取貨只應計一次。BETWEEN 包括頭尾,正午便配到兩更。直接寫開始計入、結束不計的條件,並用完整時間比較,不能只取鐘點。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:windows
編號時段開始時段結束
AM2026-10-10 09:002026-10-10 12:00
PM2026-10-10 12:002026-10-10 17:00
下載可編輯 CSV ↓
假設輸入:pickups
編號取貨時間
P12026-10-10 11:00
P22026-10-10 12:00
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE windows(id TEXT PRIMARY KEY,start_at TEXT,end_at TEXT);
CREATE TABLE pickups(id TEXT PRIMARY KEY,picked_at TEXT);
INSERT INTO windows VALUES ('AM','2026-10-10 09:00','2026-10-10 12:00'),('PM','2026-10-10 12:00','2026-10-10 17:00');
INSERT INTO pickups VALUES ('P1','2026-10-10 11:00'),('P2','2026-10-10 12:00');

重現錯誤結果,再核對更正

錯誤示範查詢:只用來重現問題
SELECT w.id,COUNT(p.id) AS pickups FROM windows w LEFT JOIN pickups p
ON p.picked_at BETWEEN w.start_at AND w.end_at GROUP BY w.id ORDER BY w.id;
實際執行的錯誤示範結果
編號取貨次數
AM2
PM1
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT w.id,COUNT(p.id) AS pickups FROM windows w LEFT JOIN pickups p
ON p.picked_at>=w.start_at AND p.picked_at<w.end_at GROUP BY w.id ORDER BY w.id;
更正查詢的實際結果
編號取貨次數
AM1
PM1
下載可編輯 CSV ↓

11:00 的 P1 屬早更,12:00 的 P2 屬午更。錯誤表兩次取貨卻有三次更別計數,更正後各一。這只是工作量分配,未改動預約或更表。

套用前先測邊界及資料範圍

最後 17:00 的取貨不在這兩段範圍,要另查時段外項目,不能為了計入而把午更尾端改成包含。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
INSERT INTO pickups VALUES ('P3','2026-10-10 17:00');
改動後再執行更正查詢的實際結果
編號取貨次數
AM1
PM1
下載可編輯 CSV ↓

設定本身有重疊或空檔時須另查;本例假設兩段已按預定次序接續。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源