資料庫查詢「某一天資料」看似簡單,實則暗藏邊界條件陷阱。Oracle 定義一天範圍為「當日 00:00:00 含今日,翌晨 00:00:00 不含」。本文提供標準 SQL 寫法與 Java 日期運算對應方案。
查詢 2014-10-01 資料 =>
bizdate >= '2014-10-01 00:00:00' AND bizdate < '2014-10-02 00:00:00'
關鍵:下界包含(>=),上界不包含(<)
SELECT TO_CHAR(bizdate, 'yyyy-MM-dd HH24:mi:ss'), id
FROM table_person
WHERE bizdate >= TO_DATE('2014-10-01 00:00:00', 'yyyy-MM-dd HH24:mi:ss')
AND bizdate < TO_DATE('2014-10-02 00:00:00', 'yyyy-MM-dd HH24:mi:ss');
Calendar cal = Calendar.getInstance(); cal.setTime(model.getRepdate()); cal.add(Calendar.DATE, 1); // 往後推一天,作為上界
| 錯誤寫法 | 問題 |
|---|---|
bizdate = '2014-10-01' | 時間元件非零時無法匹配 |
bizdate BETWEEN '2014-10-01' AND '2014-10-01 23:59:59' | 毫秒級資料遺漏,且 BETWEEN 包含上界 |
TRUNC(bizdate) = DATE '2014-10-01' | 導致全表掃描,無法使用索引 |