跳至內容
Astera Technology

跨午夜預約,為甚麼算出負時數?

計時長要用完整日期時間,不能只把結束鐘點減開始鐘點。

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

先準備用來排查的資料

預約在 23:30 開始,下一日 01:00 結束。只看時分會丟掉已過一天的資料。以完整時間相減,再把日數轉分鐘;本例按分鐘記錄,所以把小數運算取整。

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

假設輸入:bookings
編號開始時間結束時間
B12026-10-10 23:302026-10-11 01:00
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE bookings(id TEXT PRIMARY KEY,starts_at TEXT,ends_at TEXT);
INSERT INTO bookings VALUES ('B1','2026-10-10 23:30','2026-10-11 01:00');

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

錯誤示範查詢:只用來重現問題
SELECT id,60*(CAST(strftime('%H',ends_at) AS INTEGER)-CAST(strftime('%H',starts_at) AS INTEGER))
+CAST(strftime('%M',ends_at) AS INTEGER)-CAST(strftime('%M',starts_at) AS INTEGER) AS duration_minutes FROM bookings ORDER BY id;
實際執行的錯誤示範結果
編號分鐘
B1-1350
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT id,CAST(ROUND((julianday(ends_at)-julianday(starts_at))*1440,0) AS INTEGER) AS duration_minutes FROM bookings ORDER BY id;
更正查詢的實際結果
編號分鐘
B190
下載可編輯 CSV ↓

錯誤結果是負 1350 分鐘,更正後是 90 分鐘。本例跨夜是合理;若完整結束時間真的早於開始,要另列錯誤,不能取絕對值當作修正。

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

開始及結束完全相同時是零分鐘,不是一天;是否准許零長度預約要另訂。

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

新假設副本內的邊界改動
INSERT INTO bookings VALUES ('B2','2026-10-11 01:00','2026-10-11 01:00');
改動後再執行更正查詢的實際結果
編號分鐘
B190
B20
下載可編輯 CSV ↓

時間都用同一時鐘;不同時區、含糊本地時間、秒數及收費進位須另訂。

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

相關資源