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

Oracle DATE/TIMESTAMP 日期時間操作完全指南:函數、間隔運算、格式轉換與實戰範例

     編輯:Oracle 資料庫基礎

核心觀念

  • DATE:精確到秒,含年月日時分秒,無時區資訊。
  • TIMESTAMP:精確到小數秒(最多 9 位),可選帶時區(WITH TIME ZONE/WITH LOCAL TIME ZONE)。
  • Oracle 24 小時制:00:00:00 為午夜(AM 12:00),12:00:00 為中午(PM 12:00)。

常用日期函數速查

函數用途範例結果說明
ADD_MONTHS(d, n)日期加減月份ADD_MONTHS(TO_DATE('2007-02-27','YYYY-MM-DD'),1)2007-03-27 00:00:00(無時間部分保留 00:00)
ADD_MONTHS(TO_DATE('2007-02-27 12:01','YYYY-MM-DD HH24:MI'),1)2007-03-27 12:01:00(有時間部分保留時間)
ADD_MONTHS(TO_DATE('2007-02-28','YYYY-MM-DD'),1)2007-03-31 00:00:00(月末自動調整)
LAST_DAY(d)當月最後一天 00:00:00LAST_DAY(SYSDATE)本月最後一天零點
ROUND(d, [fmt])四捨五入ROUND(TO_DATE('2007-10-19 13:00','YYYY-MM-DD HH24:MI'),'DAY')2007-10-21 00:00:00(最近的週日)
TRUNC(d, [fmt])捨去(不四捨五入)TRUNC(SYSDATE,'MONTH')本月 1 號 00:00:00
EXTRACT(fmt FROM d)擷取欄位EXTRACT(MONTH FROM SYSDATE)數值型月份 (1-12)

INTERVAL 間隔運算(Oracle 9i+)

-- 減去 7 分鐘/小時/天/月/年
SELECT SYSDATE - INTERVAL '7' MINUTE FROM DUAL;
SELECT SYSDATE - INTERVAL '7' HOUR FROM DUAL;
SELECT SYSDATE - INTERVAL '7' DAY FROM DUAL;
SELECT SYSDATE - INTERVAL '7' MONTH FROM DUAL;
SELECT SYSDATE - INTERVAL '7' YEAR FROM DUAL;

-- 間隔乘數
SELECT SYSDATE - 8 * INTERVAL '2' HOUR FROM DUAL;  -- 減 16 小時

優點:語意清晰、自動處理月份長度差異、支援 DAY TO SECOND/YEAR TO MONTH 兩種間隔型別。

字串與日期互轉

TO_CHAR 日期 → 字串

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;  -- 2024-01-15 14:30:05
SELECT TO_CHAR(SYSDATE, 'YYYY-"Q"Q') FROM DUAL;              -- 2024-Q1
SELECT TO_CHAR(SYSDATE, 'IW') FROM DUAL;                     -- ISO 週數

TO_DATE 字串 → 日期

SELECT TO_DATE('2024-01-15 14:30:05', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;

格式元素同 TO_CHAR,常用:YYYY MM DD HH24 MI SS FF3(毫秒)。

實戰常見場景

需求SQL 範例
本月第一天 00:00TRUNC(SYSDATE, 'MONTH')
本月最後一天 23:59:59LAST_DAY(SYSDATE) + INTERVAL '1' DAY - INTERVAL '1' SECOND
上週一 00:00TRUNC(SYSDATE - 7, 'IW')(ISO 週一為週首)
兩日期相差天數TRUNC(end_dt) - TRUNC(start_dt)
判斷是否閏年CASE WHEN TO_CHAR(LAST_DAY(TO_DATE('02-'||yr,'MM-YYYY')), 'DD') = '29' THEN 1 ELSE 0 END
時間帶時區轉換CAST(ts_col AT TIME ZONE 'UTC' AS TIMESTAMP WITH LOCAL TIME ZONE)

效能與避坑提醒

  • 索引欄位避免函數運算:WHERE TRUNC(dt_col) = TRUNC(SYSDATE) 導致全表掃描,改用 WHERE dt_col >= TRUNC(SYSDATE) AND dt_col < TRUNC(SYSDATE)+1。
  • NLS_DATE_FORMAT 影響隱式轉換,PL/SQL 明確使用 TO_DATE/TO_CHAR 指定格式。
  • SYSDATE 回傳 DB 伺服器時間,分布式環境統一用 SYSTIMESTAMP + 時區轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved