Oracle 資料庫中常需計算月份天數、取得月首尾日期,或使用 TRUNC 函數截取日期時間。本文彙整多種寫法與效能比較,供開發參考。
核心邏輯:下個月第一天 減去 這個月第一天。
-- 寫法 1:使用 ADD_MONTHS 與 TRUNC
SELECT TO_NUMBER(
ADD_MONTHS(TRUNC(TO_DATE('2014-11-04 11:13:53', 'yyyy-mm-dd hh24:mi:ss'), 'mm'), 1)
- TRUNC(TO_DATE('2014-11-04 11:13:53', 'yyyy-mm-dd hh24:mi:ss'), 'mm')
) daycount FROM dual;
-- 寫法 2:直接使用 SYSDATE(推薦)
SELECT TO_NUMBER(
ADD_MONTHS(TRUNC(SYSDATE, 'mm'), 1) - TRUNC(SYSDATE, 'mm')
) dayscount FROM dual;
-- 寫法 3:最簡潔
SELECT ADD_MONTHS(TRUNC(SYSDATE, 'mm'), 1) - TRUNC(SYSDATE, 'mm') FROM dual;
-- 寫法 1:LAST_DAY 函數
SELECT TO_CHAR(TRUNC(ADD_MONTHS(LAST_DAY(SYSDATE), -1) + 1), 'yyyy-mm-dd') "本月第一天",
TO_CHAR(LAST_DAY(SYSDATE), 'yyyy-mm-dd') "本月最後一天"
FROM dual;
-- 寫法 2:TRUNC 截取月份
SELECT TO_CHAR(TRUNC(SYSDATE, 'MONTH'), 'yyyy-mm-dd') First_DayOfMonth,
TO_CHAR(LAST_DAY(TRUNC(SYSDATE, 'MONTH')), 'yyyy-mm-dd') Last_DayOfMonth
FROM dual;
-- 寫法 3:ADD_MONTHS 組合
SELECT ADD_MONTHS(TO_DATE(LAST_DAY(SYSDATE) + 1), -1) FROM dual; -- 本月第一天
SELECT ADD_MONTHS(TO_DATE(LAST_DAY(SYSDATE)), -1) FROM dual; -- 上月最後一天
日期截取:
TRUNC(SYSDATE) → 今天日期(時分秒歸零)TRUNC(SYSDATE, 'mm') → 本月第一天TRUNC(SYSDATE, 'yy') / TRUNC(SYSDATE, 'yyyy') → 今年第一天TRUNC(SYSDATE, 'dd') → 當前年月日TRUNC(SYSDATE, 'd') → 本週第一天(週日)TRUNC(SYSDATE, 'hh') → 當前小時(分鐘秒歸零)TRUNC(SYSDATE, 'mi') → 當前分鐘(秒歸零),不支援秒精度數字截取(不四捨五入):TRUNC(number, num_digits)
TRUNC(123.458) → 123TRUNC(123.458, 1) → 123.4TRUNC(123.458, -1) → 120TRUNC(123.458, -4) → 0