TRUNCATE

简介

TRUNCATE(x, d)
TRUNCATE(x, d)
当前存在已知实现缺陷,不应作为数值按位截断函数使用。实测中,
d
d
没有可靠地控制数值结果的小数位数,部分输入还会产生末位漂移或返回
NULL
NULL
。

需要把数值向零截断到指定小数位时,请使用

TRUNCATE_PRESTO
。

语法

TRUNCATE(x, d)

当前支持的参数类型

从实际函数解析错误看,参数

x
x
接受
INTEGER
INTEGER
、
DECIMAL
DECIMAL
或
STRING
STRING
,第二参数
d
d
为整数。

当前不接受

FLOAT
FLOAT
、
DOUBLE
DOUBLE
:

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”不一致,以当前实测为准。

数值输入的已知缺陷

TRUNCATE
TRUNCATE
当前没有兑现“保留
d
d
位小数并直接丢弃其余位数”的契约:

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 重载

当

x
x
是 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_PRESTO
TRUNCATE_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

如果需要舍入而非截断,请根据业务规则选择

ROUND
ROUND
或
BROUND
BROUND
。

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询