首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle TRUNC 函數完全指南:日期截斷與數值截取的精準用法

     編輯:Oracle 資料庫基礎

TRUNC 核心語法

-- 日期截斷
TRUNC(date [, fmt])

-- 數值截取
TRUNC(number [, decimals])

日期截斷:fmt 格式模型詳解

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'

TRUNC vs ROUND 關鍵差異

函數無 fmt 時行為有 fmt 時行為
ROUND(date, fmt)中午前截至午夜,中午後進位到次日按 fmt 指定單位四捨五入
TRUNC(date, fmt)無條件截至午夜,不考慮時間按 fmt 指定單位直接截斷

數值截取:decimals 參數詳解

  • 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) 快速分組

效能提示

  • TRUNC 為決定性函數,可用於函數索引:CREATE INDEX idx_trunc_dt ON orders(TRUNC(order_date))
  • 避免在 WHERE 條件對欄位使用 TRUNC 導致全表掃描,改用範圍查詢:WHERE dt >= TRUNC(:dt) AND dt < TRUNC(:dt)+1

TRUNC 以「直接截斷、不四捨五入」為核心語義,日期與數值雙模支援,是資料清洗、報表分組、時間窗口查詢的利器。掌握 fmt 與 decimals 的精確語義,避免隱性邏輯錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved