DECIMAL 或 DEC 标量函数

DECIMAL 函数返回数字的十进制表示,数字的字符串表示或日期时间值。

数字到 DECIMAL

Read syntax diagramSkip visual syntax diagram DECIMALDEC (numeric-expression ,precision,scale )

字符串到 DECIMAL

Read syntax diagramSkip visual syntax diagram DECIMALDEC (string-expression ,precision,scale,decimal-character )

日期时间到 DECIMAL

Read syntax diagramSkip visual syntax diagram DECIMALDEC (datetime-expression ,precision,scale)

该模式是 SYSIBM。

数字到 DECIMAL
numeric-expression
返回任何内置数值数据类型的值的表达式。
精度
具有 1-31 范围内的值的整数常量。 缺省精度取决于输入表达式的数据类型:
  • 31 表示十进制浮点 (DECFLOAT)
  • 15 表示浮点 (REAL 或 DOUBLE) 或十进制 (DECIMAL)
  • 19 表示大整数 (BIGINT)
  • 11 表示大整数 (INTEGER)
  • 5 表示小整数 (SMALLINT)
刻度
0 到 precision 值范围内的整数常量。 缺省小数位为零。

如果将第一个自变量指定给精度为 precision 且小数位为 scale的十进制列或变量,那么将出现相同的数字。 如果小数分隔符右边的位数大于小数位 scale,那么数字将从小数位的末尾截断。 如果表示整数部分所需的有效小数位数大于 精度 - 小数位 (SQLSTATE 22003) ,那么将返回错误。

字符串到 DECIMAL
string-expression
expression 返回一个值,该值是字符串 或数字 的 Unicode 图形字符串表示,其长度不大于字符常量的最大长度。 string-expression 的数据类型不得为 CLOB 或 DBCLOB (SQLSTATE 42884)。 将从字符串中除去前导和尾部空格,生成的字符串必须符合构成整数,十进制, 浮点或十进制浮点 常量的规则 (SQLSTATE 22018)。

如果需要与常量 decimal-character的代码页匹配,那么会将 string-expression 转换为 section 代码页。

精度
一个整数常量,其值在范围 1 到 31 之间,用于指定结果的精度。 如果未指定,那么缺省值为 15。
刻度
一个整数常量,其值范围为 0 到 precision ,用于指定结果的小数位。 如果未指定,那么缺省值为 0。
十进制字符
指定用于从数字的整个部分定界 string-expression 中的十进制数字的单字节字符常量。 该字符不能是数字,加号 (+) ,减号 (-) 或空白,并且最多可以在 string-expression 中出现一次 (SQLSTATE 42815)。

结果是来自 CAST (string-表达式 AS DECIMAL (精准标度)) 的相同数字。 如果小数分隔符右边的位数大于小数位 scale,那么数字将从小数位的末尾截断。 如果 string-表达式 中十进制字符 (数字的整个部分) 左侧的有效位数大于 精准 - 标度 (SQLSTATE 22003) ,那么将返回错误。 如果为 decimal-character 自变量指定了不同的值,那么缺省十进制字符在子串中无效 (SQLSTATE 22018)。

在NPS模式下,向DECIMAL发送空字符串将返回0。
日期时间到 DECIMAL
datetime-expression
返回类型为 DATE , TIME 或 TIMESTAMP 的值的表达式。
精度
一个整数常量,其值在范围 1 到 31 之间,用于指定结果的精度。 如果未指定,那么精度和小数位的缺省值取决于 datetime-expression 的数据类型,如下所示:
  • 对于 DATE ,精度为 8 ,小数位为 0。 结果是 DECIMAL (8, 0) 值,表示日期为 yyyymmdd
  • 对于 TIME ,精度为 6 ,小数位为 0。 结果是 DECIMAL (6, 0) 值,表示时间为 hhmmss
  • 对于 TIMESTAMP (tp) ,精度为 14 +tp ,小数位为 tp 。 结果是 DECIMAL (14 +tptp) 值,表示时间戳记为 yyyymmddhhmmss.nnnnnnnnnnnn
刻度
一个整数常量,其值范围为 0 到 precision ,用于指定结果的小数位。 如果未指定并且指定了 precision ,那么缺省值为 0。

结果是来自 CAST (日期时间 - 表达式 AS DECIMAL (精准标度)) 的相同数字。 如果小数分隔符右边的位数大于小数位 scale,那么数字将从小数位的末尾截断。 如果 string-表达式 中十进制字符 (数字的整个部分) 左侧的有效位数大于 精准 - 标度 (SQLSTATE 22003) ,那么将返回错误。

如果第一个参数可以为空值,那么结果可以为空值;如果第一个参数为空值,则结果为空值。
注: 应使用 CAST 规范来提高应用程序的可移植性。 有关更多信息,请参阅 CAST 规范

示例

  • 示例 1: 使用 DECIMAL 函数以强制在 EMPLOYEE 表的 EDLEVEL 列 (数据类型 = SMALLINT) 的选择列表中返回 DECIMAL 数据类型 (精度为 $TAG4 且小数位为 $TAG5)。 EMPNO 列也应显示在选择列表中。
       SELECT EMPNO, DECIMAL(EDLEVEL,5,2)
         FROM EMPLOYEE
  • 示例 2: 假定主变量 PERIOD 的类型为 INTEGER。 然后,为了将其值用作日期持续时间,必须将其 "强制类型转换" 为十进制 (8, 0)。
       SELECT PRSTDATE + DECIMAL(:PERIOD,8)
         FROM PROJECT
  • 示例 3: 假定通过以逗号作为十进制字符 (例如,用户输入 21400,50) 作为字符串的窗口输入对 SALARY 列的更新。 应用程序验证后,会将其分配给定义为 CHAR (10) 的主变量 newsalary
       UPDATE STAFF
         SET SALARY = DECIMAL(:newsalary, 9, 2, ',')
         WHERE ID = :empid;
    newsalary 的值变为 21400.50。
  • 示例 4: 将缺省十进制字符 (.) 添加到值。
       DECIMAL('21400,50', 9, 2, '.')
    这将失败,因为将句点 (.) 指定为十进制字符,但在第一个自变量中出现逗号 (,) 作为定界符。
  • 示例 5: 假定列STAR丁 (其数据类型为 TIME) 具有等同于 "12:10:00" 的内部值。
       DECIMAL(STARTING)
    生成值 121 000
  • 示例 6: 假定列 RECEIVED (其数据类型为 TIMESTAMP) 具有等同于 "1988-12-22-14.07.21.136421" 的内部值。
       DECIMAL(RECEIVED)
    生成值 19 881 222 140 721.136421
  • 示例 7: 此示例显示了各种日期时间输入值的十进制结果以及生成的精度和小数位。 假定存在具有关联值的以下列:
    列名 数据类型
    ENDDT 日期 2000年3月21日
    ENDTM 时间 12:02:21
    结束 TIMESTAMP 2000-03-21-12.02.21.123456
    ENDTS0 TIMESTAMP(0) 2000-03-21-12.02.21
    ENDTS9 TIMESTAMP (9) 2000-03-21-12.02.21.123456789
    下表显示了各种日期时间输入值的十进制结果以及生成的精度和小数位。
    DECIMAL (自变量) 精度和刻度 结果
    十进制 (ENDDT) (8,0) 20000321.
    DECIMAL (ENDDT , 10) (10,0) 20000321.
    DECIMAL (ENDDT , 12 , 2) (12,2) 20000321.00
    DECIMAL (ENDTM) (6,0) 120221.
    DECIMAL (ENDTM , 10) (10,0) 120221.
    DECIMAL (ENDTM , 10 , 2) (10,2) 120221.00
    DECIMAL (ENDTS) (20, 6) 20000321120221.123456
    DECIMAL (ENDTS , 23) (23 , 0) 20000321120221。
    DECIMAL (ENDTS , 23 和 4) (23, 4) 20000321120221.1234
    DECIMAL (ENDTS0) (14,0) 20000321120221.
    DECIMAL (ENDTS9) (23,9) 20000321120221.123456789