首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle TO_DATE 函數深度解析:格式模板、24小時制、INTERVAL 運算與毫秒精度

     編輯:Oracle 資料庫基礎

核心陷阱:MI vs MM

Oracle SQL 不區分大小寫,MM(月份)與 mm(分鐘)會衝突。分鐘必須用 MI。

-- 錯誤:ORA-01810 format code appears twice
TO_DATE('2024-01-15 14:30:59', 'YYYY-MM-DD HH24:MM:SS')

-- 正確
TO_DATE('2024-01-15 14:30:59', 'YYYY-MM-DD HH24:MI:SS')

完整格式參數速查

參數含義範例
YYYY4 位年份2024
MM2 位月份01
MON月份縮寫JAN
MONTH月份全名JANUARY
DD月內第幾天15
DDD年內第幾天015
DAY星期名稱MONDAY
DY星期縮寫MON
HH2424 小時制14
HH / HH1212 小時制02
MI分鐘30
SS秒59
FF / FFn小數秒(n 位,最多 9).123456
IWISO 週數03
IYYYISO 年份2024

日期時間間隔運算(10g+)

-- 減 7 分鐘
SELECT SYSDATE - INTERVAL '7' MINUTE FROM dual;

-- 減 7 小時
SELECT SYSDATE - INTERVAL '7' HOUR FROM dual;

-- 減 7 天
SELECT SYSDATE - INTERVAL '7' DAY FROM dual;

-- 減 7 月
SELECT SYSDATE - INTERVAL '7' MONTH FROM dual;

-- 減 7 年
SELECT SYSDATE - INTERVAL '7' YEAR FROM dual;

-- 間隔乘以純量
SELECT SYSDATE - 8 * INTERVAL '2' HOUR FROM dual;

字串轉日期與日期轉字串對照

操作函數範例
字串 → 日期TO_DATE(str, fmt)TO_DATE('2024-01-15 14:30', 'YYYY-MM-DD HH24:MI')
日期 → 字串TO_CHAR(dt, fmt)TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
字串 → 時間戳記TO_TIMESTAMP(str, fmt)TO_TIMESTAMP('2024-01-15 14:30:59.123', 'YYYY-MM-DD HH24:MI:SS.FF')
時間戳記 → 字串TO_CHAR(ts, fmt)TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF')

TRUNC / ROUND 日期截斷與四捨五入

-- 截斷至年首
SELECT TRUNC(SYSDATE, 'YEAR') FROM dual;

-- 截斷至日(預設)
SELECT TRUNC(SYSDATE) FROM dual;

-- 四捨五入至月(15 號後進下月)
SELECT ROUND(SYSDATE, 'MM') FROM dual;

毫秒級時間戳記

-- 目前時間含毫秒(精度 5 位)
SELECT TO_CHAR(CURRENT_TIMESTAMP(5), 'DD-MON-YYYY HH24:MI:SS.FF') FROM dual;

-- 僅取分秒毫秒
SELECT TO_CHAR(CURRENT_TIMESTAMP(9), 'MI:SS.FF') FROM dual;

程式執行耗時測量(百分之一秒)

DECLARE
  l_start NUMBER := DBMS_UTILITY.GET_TIME;
  l_dummy all_objects.object_name%TYPE;
  l_rc    SYS_REFCURSOR;
BEGIN
  FOR i IN 1..1000 LOOP
    OPEN l_rc FOR 'SELECT object_name FROM all_objects WHERE object_id = ' || i;
    FETCH l_rc INTO l_dummy;
    CLOSE l_rc;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(ROUND((DBMS_UTILITY.GET_TIME - l_start)/100, 2) || ' seconds');
END;
/

避坑清單

  1. 分鐘用 MI,月份用 MM,切勿混淆。
  2. HH = 12 小時制,HH24 = 24 小時制。
  3. 隱含轉換風險:WHERE dt = '2024-01-15' → 改用 DATE '2024-01-15' 或 TO_DATE(..., fmt)。
  4. NLS_DATE_LANGUAGE 影響 MON/MONTH/DAY 解析,跨語言環境請明確指定或統一用數字格式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved