Oracle TRUNC 函數可用於「日期截斷」與「數值截斷」兩大場景,語法雖簡單但極實用。本文系統整理兩類用法、格式模型與常見範例,供開發與 DBA 快速查閱。
一、TRUNC(Date) — 日期截斷
TRUNC(date [, fmt])
date:日期值(含時間元件)。
fmt:格式模型,指定截斷到哪個單位;省略則截斷到「日」(時分秒歸零)。
常用格式模型與範例
| fmt | 截斷單位 | 範例 | 結果 |
YYYY / YEAR | 年 | TRUNC(SYSDATE, 'YYYY') | 當年 1 月 1 日 00:00:00 |
MM / MONTH | 月 | TRUNC(SYSDATE, 'MM') | 當月 1 日 00:00:00 |
DD / DAY | 日 | TRUNC(SYSDATE, 'DD') | 當日 00:00:00(預設) |
D / DY | 週 | TRUNC(SYSDATE, 'D') | 本週第一天(通常為週日) |
HH / HH24 | 時 | TRUNC(TO_DATE('24-Nov-1999 08:37 PM'), 'HH') | 1999-11-24 08:00:00 |
MI | 分 | TRUNC(SYSDATE, 'MI') | 當前分鐘 0 秒 |
實用範例
TRUNC(TO_DATE('24-Nov-1999 08:00 PM'), 'DD-MON-YYYY HH:MI AM')
-- 1999-11-24 00:00:00
TRUNC(TO_DATE('24-Nov-1999 08:37 PM'), 'HH')
-- 1999-11-24 08:00:00
二、TRUNC(Number) — 數值截斷
TRUNC(number [, decimals])
number:待處理數值。
decimals:保留小數位數;省略則截去所有小數(等同取整數部);可為負數,表示小數點左側截斷。
範例對照
| 運算式 | 結果 | 說明 |
TRUNC(89.985, 2) | 89.98 | 保留 2 位小數,直接截斷不四捨五入 |
TRUNC(89.985) | 89 | 省略 decimals,截去所有小數 |
TRUNC(89.985, -1) | 80 | 負數:十位數歸零(截斷到十位) |
TRUNC(1234.56, -2) | 1200 | 截斷到百位 |
三、TRUNC vs ROUND vs FLOOR/CEIL
ROUND:四捨五入。
TRUNC:直接截斷,不進位。
FLOOR:向下取整(負數會變更小,如 FLOOR(-1.2) = -2)。
CEIL:向上取整(負數會變更大,如 CEIL(-1.2) = -1)。
四、常見應用場景
- 報表統計:
TRUNC(sale_date, 'MM') 按月分組。
- ETL 清洗:統一時間精度、金額精度。
- 分區表維護:
TRUNC(SYSDATE, 'YYYY') 計算分區邊界。