先訂清楚要判斷甚麼,再準備資料
本例只接受 YYYY-MM-DD 純日期。先檢查格式,再用 SQLite 日期運算加零日,與原值對照。只看外形會接受 2026-02-30,卻忽略 2 月沒有那一天。運算回傳空值也要明確列出,不能只靠不等於比較。
以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。
| 編號 | 業務日期 |
|---|---|
| 1 | 2026-10-01 |
| 2 | 03/04/2026 |
| 3 | NULL(未知或沒有資料) |
| 4 | 2026-02-30 |
CREATE TABLE import_rows(id INTEGER PRIMARY KEY, external_id TEXT, email TEXT, amount_cents INTEGER, business_date TEXT);
CREATE TABLE sync_attempts(id INTEGER PRIMARY KEY, external_id TEXT, outcome TEXT);
CREATE TABLE target_records(id TEXT PRIMARY KEY, external_id TEXT UNIQUE);
INSERT INTO import_rows VALUES (1,'X1','a@example.test',10000,'2026-10-01'),(2,'X2',' ',20000,'03/04/2026'),(3,'X3',NULL,NULL,NULL),(4,'X4','d@example.test',0,'2026-02-30');
INSERT INTO sync_attempts VALUES (1,'X1','success'),(2,'X2','success'),(3,'X3','failed');
INSERT INTO target_records VALUES ('T1','X1');執行查詢,核對實際結果
SELECT id,business_date FROM import_rows
WHERE business_date IS NULL
OR business_date NOT GLOB '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
OR date(business_date,'+0 days') IS NULL
OR date(business_date,'+0 days')<>business_date
ORDER BY id;| 編號 | 業務日期 |
|---|---|
| 2 | 03/04/2026 |
| 3 | NULL(未知或沒有資料) |
| 4 | 2026-02-30 |
03/04/2026 未說明日月次序,所以不接受;第 3 筆沒有日期;2026-02-30 經運算會變成另一日,也不接受。2026-10-01 正常。應向原資料負責人確認真正日期,不能把不存在的日子自動改成另一日。
按資料範圍使用結果
已在本次 SQLite 執行環境測試,未測 PostgreSQL、試算表日期序號或時間戳記解析。業務可接受的年份範圍要另訂;時區及日期連時間也須各自有匯入規則。
本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。