先準備用來排查的資料
兩更在正午接續,每次取貨只應計一次。BETWEEN 包括頭尾,正午便配到兩更。直接寫開始計入、結束不計的條件,並用完整時間比較,不能只取鐘點。
以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。
| 編號 | 時段開始 | 時段結束 |
|---|---|---|
| AM | 2026-10-10 09:00 | 2026-10-10 12:00 |
| PM | 2026-10-10 12:00 | 2026-10-10 17:00 |
| 編號 | 取貨時間 |
|---|---|
| P1 | 2026-10-10 11:00 |
| P2 | 2026-10-10 12:00 |
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;| 編號 | 取貨次數 |
|---|---|
| AM | 2 |
| PM | 1 |
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;| 編號 | 取貨次數 |
|---|---|
| AM | 1 |
| PM | 1 |
11:00 的 P1 屬早更,12:00 的 P2 屬午更。錯誤表兩次取貨卻有三次更別計數,更正後各一。這只是工作量分配,未改動預約或更表。
套用前先測邊界及資料範圍
最後 17:00 的取貨不在這兩段範圍,要另查時段外項目,不能為了計入而把午更尾端改成包含。
邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。
INSERT INTO pickups VALUES ('P3','2026-10-10 17:00');| 編號 | 取貨次數 |
|---|---|
| AM | 1 |
| PM | 1 |
設定本身有重疊或空檔時須另查;本例假設兩段已按預定次序接續。
以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。