ROUND 函数

ROUND 函数可降低它的第一个数值、MONEY、DATE 或 DATETIME 参数的精度,并返回四舍五入了的值。如果第一个参数不是数值、MONEY 值或时间点,则必须将它强制转型为数值的、MONEY、DATE 或 DATETIME 数据类型。

下图展示 ROUNDTRUNC 代数函数的语法,它们支持相同的语法。然而,由于它们的语义不同,它们可从相同的参数列表返回不同的值。 仅 ROUND 可返回大于它的第一个参数的绝对值。
ROUND 和 TRUNC 代数函数
元素 描述 限制 语法
date_expression 求值为(或强制转型为)DATE 值的表达式 必须返回 DATE 值 表达式
datetime_expression 求值为(或强制转型为)DATETIME 值的表达式 必须返回 DATETIME 值 表达式
factor 在返回的值中以零替代的有效数字的数目。缺省的是返回四舍五入的或截断的第一个参数的整数部分。 取值范围为 +32 至 -32 的整数。正值或无符号值适用于小数点的右边,而负值适用于左边。 文字的数值
num_expression 求值为(或强制转型为)数值值的表达式 实数 表达式

用法

ROUND 函数与 TRUNC 函数相似,其语法如上所示。然而,ROUND 的不同之处在于它如何处理精度之内小于最小有效数字或时间单位的它的第一个参数的任何部分,它的显式的或缺省的第二个参数指定该精度。
  • 如果此部分的绝对值等于或大于该精度内最小单位的一半,则那个数字或时间单位的值为由 ROUND 返回的值中增加 1。然而,如果这部分小于一个单位的一半,则丢弃它,仅返回指定的或缺省的精度之内第一个参数的数值或时间单位。

    也就是说,如果第一个参数大于零,则
    • ROUND 函数舍去在第二个参数的精度之内小于最小有效数字或时间的一半单位的它的第一个参数的任何部分,
    • 但向上舍入等于或大于半个单位的第一个参数的任何部分。
    例如,ROUND(3.5,0) = 4ROUND(3.4,0) = 3
    但如果第一个参数小于零,则
    • ROUND 函数向上舍入在第二个参数的精度之内的小于最小有效数字或时间单位的半个单位的它的第一个参数的任何部分,
    • 但舍去等于或大于半个单位的第一个参数的任何部分。
    例如,ROUND(-3.5,0) = -4ROUND(-3.4,0) = -3
  • 相反地,TRUNC 函数以零替代数值表达式的小于指定精度的任何数值。对于 DATE 或 DATETIME 表达式,TRUNC 替换小于指定格式字符串的任何时间单位,以 1 替换 monthday 时间单位,或以零替换小于 day 的时间单位。

ROUND 函数可接受可选的第二个参数,其指定返回的值的精度。第二个参数的语法和语义依赖于第一个字符是否为数值表达式、DATETIME 表达式或 DATE 表达式。

对数值和 MONEY 值的四舍五入

DATE 和 DATETIME 值的四舍五入

当第一个参数为 DATE 数据类型时,如果您未指定格式字符串作为第二个参数,则缺省情况下没有格式字符串生效。不发出错误,但将第一个参数作为求值为整数的数值表达式来处理,而不作为 DATE 值。 GBase 8s 在内部将 DATE 值存储为从 1899 年 12 月 31 日以来的整数计数。对于 21 世纪中的日期,等同于 DATE 值的整数是 5 位整数,取值范围大约在 37,000 与 74,000 之间。

例如,查询 SELECT ROUND(TODAY) FROM systables 不为 DATE 表达式提供格式字符串,且如果在 2012 年 4 月 1 日发出该查询,则返回整数 40999

如果您应用数值格式规范作为第二个参数,则非负的数值对 DATE 值不起作用,但下列示例将返回值的最后两个数字舍入为零:
SELECT ROUND(TODAY, -2) FROM systables;
在 2012 年 4 月 1 日,上述查询会返回整数值 40900

在下一天,2012 年 4 月 2 日,同一查询会返回整数值 41000

对于像 41000 这样的整数格式日期是有用的应用,您可使用 'YEAR'、'MONTH'、'DAY' 或 'DD' 格式字符串作为 ROUND 函数的第二个参数来防止将 DATE 参数处理成 一个数值表达式。在 2012 年 4 月 1 日,下列查询返回 DATE 值 04/01/2012,如果 MDY4/DBDATE 环境变量设置的话:
SELECT ROUND(TODAY, 'DD') FROM systables WHERE tabid = 1;
在下列示例中,在 2012 年 4 月 3 日(星期二)发出一查询:
SELECT ROUND(TODAY, 'DAY') FROM mytab;
        
返回的值为 03/31/2012,当前的日期四舍五入到最近的星期天。
如果您正在使用主变量来在动态的 SQL 中存储四舍五入了的时间点值,且在准备时刻不知道第一个参数的数据类型,则 GBase 8s 假设 ROUND 函数的第一个参数是 DATETIME 数据类型,并返回 DATETIME YEAR TO MINUTE 四舍五入的值。在执行时刻,则准备该语句之后,如果为该主变量提供 DATE 值,则发出错误 -9750。要防止发生此错误,您可通过使用强制转型为主变量指定数据类型,如此程序片断中所示。
sprintf(query1, ", 
          "select round( ?::date, 'DAY') from mytab");
          EXEC SQL prepare selectq from :query;
          EXEC SQL declare select_cursor cursor for selectq;
          EXEC SQL open select_cursor using :hostvar_date_input;
          
          EXEC SQL fetch select_cursor into :var_date_output;
        

要了解可为内建的按时间顺序排列的数据类型指定显示和数据条目格式的 GBase 8s 环境变量之中的优先顺序,请参阅主题 DATE 和 DATETIME 格式规范的优先顺序