Contents

Oracle 時間運算 筆記

Oracle 的日期時間處理與其他資料庫有不少差異,整理常用的時間資料型別、運算函式與格式轉換方式,方便日後查閱。

時間資料型別

型別 說明
DATE 儲存日期與時間,精確到秒(年月日時分秒),不含時區資訊
TIMESTAMP 比 DATE 更精確,可到小數秒(最高 9 位小數),不含時區
TIMESTAMP WITH TIME ZONE 含時區資訊的時間戳記
TIMESTAMP WITH LOCAL TIME ZONE 轉換為資料庫時區後儲存
INTERVAL YEAR TO MONTH 表示年月間隔
INTERVAL DAY TO SECOND 表示天到秒的間隔

取得當前時間

1
2
3
4
5
6
7
8
-- 取得當前日期與時間(DATE 型別)
SELECT SYSDATE FROM DUAL;

-- 取得當前時間戳記(TIMESTAMP 型別)
SELECT SYSTIMESTAMP FROM DUAL;

-- 取得當前日期(只有日期部分)
SELECT TRUNC(SYSDATE) FROM DUAL;

日期加減運算

Oracle 的 DATE 型別可以直接加減數字,單位為

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
-- 加 7 天
SELECT SYSDATE + 7 FROM DUAL;

-- 減 1 天
SELECT SYSDATE - 1 FROM DUAL;

-- 加 3 小時(1/24 天)
SELECT SYSDATE + 3/24 FROM DUAL;

-- 加 30 分鐘(30/(24*60) 天)
SELECT SYSDATE + 30/1440 FROM DUAL;

ADD_MONTHS:加減月份

直接加減月份不能用數字,必須用 ADD_MONTHS 函式:

1
2
3
4
5
-- 加 3 個月
SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL;

-- 減 6 個月
SELECT ADD_MONTHS(SYSDATE, -6) FROM DUAL;

MONTHS_BETWEEN:計算月份差

1
2
3
-- 計算兩個日期相差幾個月
SELECT MONTHS_BETWEEN(DATE '2024-06-01', DATE '2024-01-01') FROM DUAL;
-- 結果:5

TRUNC 與 ROUND:截斷與四捨五入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
-- 截斷到當天 00:00:00
SELECT TRUNC(SYSDATE) FROM DUAL;

-- 截斷到本月第一天
SELECT TRUNC(SYSDATE, 'MM') FROM DUAL;

-- 截斷到本年第一天
SELECT TRUNC(SYSDATE, 'YYYY') FROM DUAL;

-- 四捨五入到最近的日期
SELECT ROUND(SYSDATE, 'DD') FROM DUAL;

-- 四捨五入到最近的月份(15 號之後進到下個月)
SELECT ROUND(SYSDATE, 'MM') FROM DUAL;

計算兩個日期的時間差

1
2
3
4
5
6
7
8
-- 相差幾天(SYSDATE - 某日期,回傳天數)
SELECT SYSDATE - DATE '2024-01-01' FROM DUAL;

-- 相差幾小時
SELECT (SYSDATE - DATE '2024-01-01') * 24 FROM DUAL;

-- 相差幾分鐘
SELECT (SYSDATE - DATE '2024-01-01') * 24 * 60 FROM DUAL;

查詢昨天的資料

1
2
3
4
5
6
-- 查詢昨天整天的資料
SELECT *
FROM orders oh
WHERE oh.tran_date BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400;
-- TRUNC(SYSDATE - 1)  = 昨天 00:00:00
-- TRUNC(SYSDATE) - 1/86400 = 昨天 23:59:59

格式轉換

TO_DATE:字串轉日期

1
2
3
-- 字串轉 DATE
SELECT TO_DATE('2024-06-15', 'YYYY-MM-DD') FROM DUAL;
SELECT TO_DATE('2024/06/15 14:30:00', 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;

TO_CHAR:日期轉字串

1
2
3
4
5
6
7
8
9
-- 日期轉字串
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') FROM DUAL;

-- 取得星期幾
SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;  -- 例:WEDNESDAY

-- 格式化為中文日期
SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"') FROM DUAL;

常用格式代碼:

格式 說明
YYYY 四位年份
MM 月份(01-12)
DD 日期(01-31)
HH24 24 小時制的小時
MI 分鐘
SS
DAY 星期幾全稱
DY 星期幾縮寫

參考資料