-- 日期截斷
TRUNC(date [, fmt])
-- 數值截取
TRUNC(number [, decimals])
fmt 指定截斷精度,省略時預設截至午夜(00:00:00)。
| fmt 值 | 截斷精度 | 說明 |
|---|---|---|
| YYYY / YEAR | 年 | 精確到年首 (01-01 00:00:00) |
| MM / MONTH | 月 | 精確到月首 (01 00:00:00),忽略年份差異 |
| DD / DAY | 日 | 精確到日首 (00:00:00),忽略年月差異 |
| HH / HH24 | 時 | 精確到整點 |
| MI | 分 | 精確到整分 |
-- 無 fmt:截至午夜
TRUNC(TO_DATE('24-Nov-1999 08:00 PM','DD-MON-YYYY HH:MI AM'))
= '24-Nov-1999 12:00:00 AM'
-- fmt='HH':截至整點
TRUNC(TO_DATE('24-Nov-1999 08:37 PM','DD-MON-YYYY HH:MI AM'), 'HH')
= '24-Nov-1999 08:00:00 AM'
| 函數 | 無 fmt 時行為 | 有 fmt 時行為 |
|---|---|---|
| ROUND(date, fmt) | 中午前截至午夜,中午後進位到次日 | 按 fmt 指定單位四捨五入 |
| TRUNC(date, fmt) | 無條件截至午夜,不考慮時間 | 按 fmt 指定單位直接截斷 |
decimals > 0:保留小數點後 N 位,其餘截斷decimals = 0 或省略:截斷所有小數,保留整數decimals < 0:從小數點左側第 N 位開始截斷(以 0 填補)TRUNC(89.985, 2) = 89.98 -- 保留 2 位小數
TRUNC(89.985) = 89 -- 截斷小數
TRUNC(89.985, -1) = 80 -- 十位截斷,個位歸零
TRUNC(89.985, -2) = 0 -- 百位截斷
TRUNC(order_date, 'MM') 按月彙總WHERE log_time >= TRUNC(SYSDATE) AND log_time < TRUNC(SYSDATE+1) 查詢今日資料TRUNC(amount, 2) 強制兩位小數,不四捨五入TRUNC(id/1000) 快速分組CREATE INDEX idx_trunc_dt ON orders(TRUNC(order_date))WHERE dt >= TRUNC(:dt) AND dt < TRUNC(:dt)+1TRUNC 以「直接截斷、不四捨五入」為核心語義,日期與數值雙模支援,是資料清洗、報表分組、時間窗口查詢的利器。掌握 fmt 與 decimals 的精確語義,避免隱性邏輯錯誤。