类别:

:doc:`/sql-reference/functions-numeric`(舍入和截断)

TRUNCATE、TRUNC

将输入表达式向下舍入到最接近于(或等于)零的值。根据您指定为标度参数的值,转换可以删除:

  • 小数点后的所有数字,生成一个整数值。这是适用于数值的 TRUNC 的默认且最常见的用法。

  • 小数点后的一些有效数字,生成一个不太精确的值。

  • 小数点后的所有有效数字和小数点左侧的一些有效数字,生成的值是 10、100 或其他 10 的幂次方倍数。

TRUNCATE 和 TRUNC 函数为同义函数。

备注

TRUNC 是重载函数。它还可以用于日期/时间值,以便 将日期、时间及时间戳截断 到指定的部分。适用于数值的 TRUNC 包含一个必需参数和一个可选参数。适用于日期/时间值的 TRUNC 包含两个必需参数。

另请参阅:

CEILFLOORROUND

语法

TRUNCATE( <input_expr> [ , <scale_expr> ] )

TRUNC( <input_expr> [ , <scale_expr> ] )
Copy

实参

input_expr

要执行操作的值或表达式。数据类型必须为数值数据类型之一,例如 FLOAT 或 NUMBER。

scale_expr

小数点后要包含的位数。使用计算结果为 -38 到 +38 的整数的表达式。

默认 scale_expr 值为零,这意味着该函数会移除小数点后的所有数字。

有关负小数位数的信息,请参阅下面的 使用说明

返回

返回值的数据类型是 NUMBER (精确度、范围)。

如果输入大小大于或等于零,则输出范围通常与输入范围匹配。

如果输入大小为负,则输出范围为 0。

例如:

  • TRUNCATE(3.14, 1) 返回的数据类型为 NUMBER(4, 1)

  • TRUNCATE(3.14, 0) 返回的数据类型为 NUMBER(4, 0)

  • TRUNCATE(33.33, -1) 返回的数据类型为 NUMBER(5, 0)

如果大小为零,则该值实际上是一个整数。

使用说明

  • 如果 scale_expr 为负数,则指定需要调整数字的小数点 之前 的位数。例如,如果大小为 -2,则结果是 100 的倍数。

  • 如果 scale_expr 大于输入表达式大小,则该函数不生效。

  • 如果 input_exprscale_expr 为 NULL,则结果为 NULL。

  • 截断是向 0 执行的,而不是向较小的数字执行截断。例如,TRUNCATE(-9.6) 的结果是 -9,而不是 -10

示例

以下示例演示了适用于数值的 TRUNC 函数。有关截断日期、时间和时间戳的示例,请参阅 TRUNC 的日期/时间形式

该示例使用了此示例表中的数据。该表包含两个不同的十进制数 -975.975 和 135.135,以及用于 TRUNC 函数的标度参数的不同值。

CREATE TABLE numeric_trunc_demo (n FLOAT, scale INTEGER);
INSERT INTO numeric_trunc_demo (n, scale) VALUES
   (-975.975, -1), (-975.975,  0), (-975.975,  2),
   ( 135.135, -2), ( 135.135,  0), ( 135.135,  1),
   ( 135.135,  3), ( 135.135, 50), ( 135.135, NULL);
Copy

当不指定标度参数时,TRUNC 对于数值参数的默认行为是返回与参数相等的整数值,或者更接近零的值。指定标度参数为 0 也会执行同样的操作。

SELECT DISTINCT n, TRUNCATE(n)
  FROM numeric_trunc_demo ORDER BY n;
Copy
+----------+-------------+
|        N | TRUNCATE(N) |
|----------+-------------|
| -975.975 |        -975 |
|  135.135 |         135 |
+----------+-------------+

以下示例显示了对正数和负数应用零标度参数、正标度参数或负标度参数时,调用 TRUNC 函数的结果。

  • 指定零标度参数将会删除小数点后的所有数字,生成一个整数值。

  • 指定正标度参数将会在小数点后保留指定的有效位数。

  • 指定负标度参数会将小数点左侧的相应位数的数字变为零。

  • 指定大于 +38 或小于 -38 的标度与指定 +38 或 -38 相同。

SELECT n, scale, TRUNC(n, scale)
  FROM numeric_trunc_demo ORDER BY n, scale;
Copy
+----------+-------+-----------------+
|        N | SCALE | TRUNC(N, SCALE) |
|----------+-------+-----------------|
| -975.975 |    -1 |        -970     |
| -975.975 |     0 |        -975     |
| -975.975 |     2 |        -975.97  |
|  135.135 |    -2 |         100     |
|  135.135 |     0 |         135     |
|  135.135 |     1 |         135.1   |
|  135.135 |     3 |         135.135 |
|  135.135 |    50 |         135.135 |
|  135.135 |  NULL |            NULL |
+----------+-------+-----------------+
语言: 中文