Oracle TRUNC(number, decimals) 可直接截斷數字至指定小數位 (或負數截斷整數位),SQL Server 無同名函數,需組合 ROUND 與 FLOOR 達成相同效果。
| Oracle | 結果 | SQL Server 等效寫法 | 說明 |
|---|---|---|---|
TRUNC(15.79, 1) | 15.7 | ROUND(15.79, 1, 1) | ROUND 第 3 參數 = 1 表示截斷而非四捨五入 (2008+) |
TRUNC(15.79, 0) | 15 | ROUND(15.79, 0, 1) 或 FLOOR(15.79) | FLOOR 向下取整 (負數會更小,如 -1.2 → -2) |
TRUNC(-15.79, 1) | -15.7 | ROUND(-15.79, 1, 1) | ROUND 截斷模式對正負數同向截斷 |
TRUNC(1579, -2) | 1500 | ROUND(1579, -2, 1) | 負數 decimals 截斷整數位 |
-- 1. ROUND 截斷模式 (第 3 參數 function = 1)
SELECT ROUND(15.79, 1, 1) AS trunc_1_decimal; -- 15.7
SELECT ROUND(15.79, 0, 1) AS trunc_integer; -- 15
-- 2. FLOOR 僅適用正數截斷至整數
SELECT FLOOR(15.79); -- 15
SELECT FLOOR(-15.79); -- -16 (注意:向下取整,非向零截斷)
-- 3. 通用自訂函數 (相容舊版 SQL Server)
CREATE FUNCTION dbo.TRUNC_NUM (@val FLOAT, @dec INT)
RETURNS FLOAT
AS BEGIN
DECLARE @factor FLOAT = POWER(10, @dec);
RETURN CASE WHEN @val >= 0 THEN FLOOR(@val * @factor) / @factor
ELSE CEILING(@val * @factor) / @factor END; -- 向零截斷
END;
TRUNC 對負數**向零截斷** (-15.79 → -15.7);SQL Server FLOOR **向下取整** (-15.79 → -16),語義不同,**務必用 ROUND(..., 1) 或自訂函數**。ROUND 第 3 參數需 SQL Server 2008 以上;舊版必須用自訂函數或 CAST(FLOOR(val * 10) / 10 AS DECIMAL(10,1)) 變通。DECIMAL(38,10) 等固定精度,遷移時確認精度足夠。