在 Oracle 資料庫中,TRUNC(date[, fmt]) 函數能依指定格式截斷日期值,保留所需的時間粒度。若省略 fmt 參數,預設會截去時間部分,僅保留日期(即午夜 00:00:00)。
| 格式模型 | 說明 | 範例輸入 | 結果 |
|---|---|---|---|
| YYYY / YEAR | 年度第一天(1 月 1 日) | TRUNC(SYSDATE, 'YYYY') | 2024-01-01 00:00:00 |
| MM / MONTH | 月份第一天 | TRUNC(SYSDATE, 'MM') | 2024-03-01 00:00:00 |
| D / DAY | 本週第一天(週日) | TRUNC(SYSDATE, 'D') | 2024-03-10 00:00:00 |
| DD | 當天日期(去除時間) | TRUNC(SYSDATE, 'DD') | 2024-03-15 00:00:00 |
| HH / HH24 | 整點小時 | TRUNC(TO_DATE('24-Nov-1999 08:37 pm','dd-mon-yyyy hh:mi am'), 'HH') | 1999-11-24 20:00:00 |
| MI | 整分 | TRUNC(TO_DATE('24-Nov-1999 08:37:45 pm','dd-mon-yyyy hh:mi:ss am'), 'MI') | 1999-11-24 20:37:00 |
實務技巧: 結合 SYSDATE 可快速取得「本月首日」、「本年度首日」等邊界值,常用於報表篩選或分區裁剪。
TRUNC(number[, decimals]) 會直接截斷數值,不做任何四捨五入。decimals 為正時保留小數位;為負時向左截斷至十位、百位等;省略則截去所有小數。
TRUNC(89.985, 2) = 89.98 -- 保留兩位小數
TRUNC(89.985) = 89 -- 截去所有小數
TRUNC(89.985, -1) = 80 -- 截至十位(個位歸零)
TRUNC(1234.56, -2) = 1200 -- 截至百位
關鍵差異: ROUND(89.985, 2) = 89.99(四捨五入),而 TRUNC 永遠只是「切掉」多餘位數,適合需嚴格截斷的財務或統計計算。
YYYY, MM, D, HH, MI)快速對齊時間邊界。decimals 可為負數,方便處理「捨去尾數」需求。TRUNC 為內建單行函數,執行效率極高,可放心用於大量資料的 WHERE 條件或 SELECT 列表中。