首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 時間運算速查大全:SYSDATE 間隔運算、ADD_MONTHS、TRUNC/ROUND、LAST_DAY 與 NEXT_DAY

     編輯:Oracle 資料庫相關知識

一、SYSDATE 基礎間隔運算(舊版兼容寫法)

需求表達式原理
+5 秒SYSDATE + 5/24/60/601天=24*60*60秒
+5 分鐘SYSDATE + 5/24/601天=24*60分
+5 小時SYSDATE + 5/241天=24小時
+5 天SYSDATE + 5日期整數=天
-5 月ADD_MONTHS(SYSDATE, -5)月邊界自動處理
-5 年ADD_MONTHS(SYSDATE, -60)年轉月

二、月/年邊界計算

需求SQL
上月末日期LAST_DAY(ADD_MONTHS(SYSDATE, -1))
本月最後一秒TRUNC(ADD_MONTHS(SYSDATE,1),'MM') - 1/24/60/60
本周一日期TRUNC(SYSDATE,'DAY') + 1
年初至今天數CEIL(SYSDATE - TRUNC(SYSDATE,'YEAR'))
今年第幾周TO_CHAR(SYSDATE,'IW')
本月第幾周TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1
本月天數TO_CHAR(LAST_DAY(SYSDATE),'DD')
今年天數ADD_MONTHS(TRUNC(SYSDATE,'YEAR'),12) - TRUNC(SYSDATE,'YEAR')
下周一日期NEXT_DAY(SYSDATE,'MONDAY')

三、高精度時間戳運算(9i+ 推薦)

-- 當前時間含微秒
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;

四、業務時間窗口判斷範例

-- 記錄最大時間 + 14 月 > 當前時間 → 有效(1)
SELECT CASE WHEN CURRENT_DATE < 
  (SELECT ADD_MONTHS(MAX(med_time), 14) FROM red_meetting_record 
   WHERE med_tar_id='225' AND med_usr_id='001387')
THEN 1 ELSE 0 END AS contains FROM DUAL;

五、性能與最佳實踐

  • WHERE 條件禁用函數包裹列:WHERE TRUNC(created) = SYSDATE → 全表掃描;改用 WHERE created >= TRUNC(SYSDATE) AND created < TRUNC(SYSDATE)+1;
  • 分區表按時間列分區時,確保查詢條件類型與分區鍵一致,觸發分區裁剪;
  • 批量時間運算優先用 INTERVAL 字面量(SYSDATE + INTERVAL '5' HOUR),可讀性與精度雙贏;
  • 跨時區應用統一使用 TIMESTAMP WITH LOCAL TIME ZONE 存儲,應用層僅處理顯示轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved