TRUNCATE
简介
TRUNCATE(x, d)TRUNCATE(x, d)
当前存在已知实现缺陷,
不应作为数值按位截断函数使用 。实测中,
dd
没有可靠地控制数值结果的小数位数,部分输入还会产生末位漂移或返回
NULLNULL
。
需要把数值向零截断到指定小数位时,请使用 TRUNCATE_PRESTOTRUNCATE_PRESTO
。
⚠️ 本页行为最后验证于 2026-09-22,客户端为
cz-cli 2.0.6cz-cli 2.0.6
。后续版本若修复实现,应同步更新本页和回归用例。
语法
TRUNCATE(x, d)
当前支持的参数类型
从实际函数解析错误看,参数
xx
接受
INTEGERINTEGER
、
DECIMALDECIMAL
或
STRINGSTRING
,第二参数
dd
为整数。
当前不接受
FLOATFLOAT
、
DOUBLEDOUBLE
:
SELECT TRUNCATE(CAST(3.14159 AS DOUBLE), 2);
-- CZLH-42000: invalid type 'double' of argument 1,
-- expect 'integer, decimal or string'
SELECT TRUNCATE(CAST(3.14159 AS FLOAT), 2);
-- CZLH-42000: invalid type 'float' of argument 1,
-- expect 'integer, decimal or string'
这与旧版文档所述“支持 FLOAT、DOUBLE”不一致,以当前实测为准。
数值输入的已知缺陷
TRUNCATETRUNCATE
当前没有兑现“保留
dd
位小数并直接丢弃其余位数”的契约:
SELECT
TRUNCATE(3.14159, 2),
TYPEOF(TRUNCATE(3.14159, 2));
-- 3.14158 | decimal(6,5)
SELECT TRUNCATE(3.14500, 2);
-- 3.14500
SELECT TRUNCATE(-3.14159, 2);
-- -3.14160
SELECT TRUNCATE(314159, 2);
-- 314158
结果仍保留输入 DECIMAL 的原始 scale;它不是仅影响显示格式的普通浮点误差。其他 scale 也不可靠:
SELECT
TRUNCATE(9.99, 0),
TRUNCATE(-9.99, 0),
TRUNCATE(123.456, -1),
TRUNCATE(123.456, -2);
-- NULL | NULL | 123.456 | 123.456
STRING 重载
当
xx
是 STRING 时,当前重载表现为按字符数截取前缀,而不是数值截断:
SELECT
TRUNCATE('abcdef', 0),
TRUNCATE('abcdef', 1),
TRUNCATE('abcdef', 2),
TRUNCATE('abcdef', -1);
-- '' | 'a' | 'ab' | ''
推荐写法
精确数值截断:
SELECT TRUNCATE_PRESTO(CAST(3.14159 AS DECIMAL(18,5)), 2);
-- 3.14
TRUNCATE_PRESTOTRUNCATE_PRESTO
也接受 DOUBLE,并返回按目标 scale 推导的 DECIMAL:
SELECT
TYPEOF(TRUNCATE_PRESTO(CAST(3.14159 AS DOUBLE), 2)),
TRUNCATE_PRESTO(CAST(3.14159 AS DOUBLE), 2);
-- decimal(18,2) | 3.14
如果需要舍入而非截断,请根据业务规则选择
ROUNDROUND
或
BROUNDBROUND
。