以 2007-11-02 13:45:25 為例:
| 類別 | 格式 | 說明 | 範例輸出 |
|---|---|---|---|
| 年 | YY | 兩位年 | 07 |
| YYY | 三位年 | 007 | |
| YYYY | 四位年 | 2007 | |
| RRRR | 兩位年自動換世紀 | 99→1999, 01→2001 | |
| 月 | MM | 兩位數字月 | 11 |
| MON | 縮寫月名 | 11月 / NOV | |
| MONTH | 完整月名 | 11月 / NOVEMBER | |
| 日 | DD | 月內第幾天 | 02 |
| DDD | 年內第幾天 | 306 | |
| DY | 星期縮寫 | 五 / FRI | |
| DAY | 星期全名 | 星期五 / FRIDAY | |
| 序數詞 | TWELFTH | ||
| 時 | HH | 12 小時制 | 01 |
| HH24 | 24 小時制 | 13 | |
| 分 | MI | 60 進制 | 45 |
| 秒 | SS | 60 進制 | 25 |
| 季度 | Q | 1-4 | 4 |
| 年週 | WW | 1-53 | 44 |
| 月週 | W | 1-5 | 1 |
-- 日期轉字串
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS now_time FROM dual;
SELECT TO_CHAR(SYSDATE, 'YYYY') AS yr, TO_CHAR(SYSDATE, 'MM') AS mon FROM dual;
-- 字串轉日期
SELECT TO_DATE('2004-05-07 13:23:44', 'YYYY-MM-DD HH24:MI:SS') FROM dual;
SELECT TO_CHAR(TO_DATE('2002-08-26', 'YYYY-MM-DD'), 'DAY') FROM dual; -- 星期一
SELECT TO_CHAR(TO_DATE('2002-08-26', 'YYYY-MM-DD'), 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN') FROM dual; -- MONDAY
-- Session 級設定語言
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
SELECT FLOOR(SYSDATE - TO_DATE('20020405', 'YYYYMMDD')) FROM dual;
SELECT id, active_date FROM table1
UNION
SELECT 1, TO_DATE(NULL) FROM dual; -- 必須用 TO_DATE(NULL)
SELECT MONTHS_BETWEEN(
TO_DATE('01-31-1999', 'MM-DD-YYYY'),
TO_DATE('12-31-1998', 'MM-DD-YYYY')
) FROM dual; -- 1
SELECT MONTHS_BETWEEN(
TO_DATE('02-01-1999', 'MM-DD-YYYY'),
TO_DATE('12-31-1998', 'MM-DD-YYYY')
) FROM dual; -- 1.032...
-- NEXT_DAY(date, day) : day 可為 1(日)-7(六) 或 名稱
SELECT NEXT_DAY(SYSDATE, 6) FROM dual; -- 下一個星期五
SELECT NEXT_DAY(SYSDATE, 'FRIDAY') FROM dual;
SELECT
TRUNC(SYSDATE, 'MM') AS first_day_this_month,
LAST_DAY(TRUNC(SYSDATE, 'MM')) AS last_day_this_month,
TRUNC(TRUNC(SYSDATE, 'MM') - 1, 'MM') AS first_day_last_month,
TRUNC(SYSDATE, 'MM') - 1/86400 AS last_day_last_month
FROM dual;
SELECT
TRUNC(MONTHS_BETWEEN(newer, older)/12) AS years,
MOD(TRUNC(MONTHS_BETWEEN(newer, older)), 12) AS months,
TRUNC(newer - ADD_MONTHS(older, TRUNC(MONTHS_BETWEEN(newer, older)/12)*12 + MOD(TRUNC(MONTHS_BETWEEN(newer, older)), 12))) AS days
FROM (
SELECT HIREDATE AS older, ADD_MONTHS(HIREDATE, ROWNUM)+ROWNUM AS newer FROM EMP
);
-- 2 月最後一天若為 29 則為閏年
SELECT TO_CHAR(LAST_DAY(TO_DATE('02' || :year, 'MMYYYY')), 'DD') FROM dual;
SELECT TO_CHAR(NEW_TIME(SYSDATE, 'GMT', 'EST'), 'DD/MM/YYYY HH:MI:SS'), SYSDATE FROM dual;
SELECT
ROUND(SYSDATE) AS r_day, -- 最近午夜
ROUND(SYSDATE, 'YEAR') AS r_year, -- 1/1 午夜
ROUND(SYSDATE, 'MONTH') AS r_mon, -- 1 號午夜
TRUNC(SYSDATE) AS t_day, -- 今日 00:00:00
TRUNC(SYSDATE, 'MONTH') AS t_mon -- 本月 1 號 00:00:00
FROM dual;
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 02:38:40') FROM dual; -- 2
SELECT TO_CHAR(SYSDATE, 'HH24') FROM dual; -- 24制字串
mm 是分,MM 才是月。BETWEEN date1 AND date2 包含邊界,但若含時間元件,2001-12-31 12:00 會被排除,建議用 TRUNC 或 >= AND <。YYYY vs RRRR:兩位年輸入時 RRRR 會依當前世紀自動推斷(50 年分界),避免 2000 年問題。Oracle 日期運算以「天」為單位,加減年月請用
ADD_MONTHS、MONTHS_BETWEEN,切勿直接乘 365/30,以免閏年、大小月導致誤差。