ROUND 函数可降低它的第一个数值、MONEY、DATE 或 DATETIME 参数的精度,并返回四舍五入了的值。如果第一个参数不是数值、MONEY 值或时间点,则必须将它强制转型为数值的、MONEY、DATE 或 DATETIME 数据类型。
如果此部分的绝对值等于或大于该精度内最小单位的一半,则那个数字或时间单位的值为由 ROUND 返回的值中增加 1。然而,如果这部分小于一个单位的一半,则丢弃它,仅返回指定的或缺省的精度之内第一个参数的数值或时间单位。
ROUND 函数可接受可选的第二个参数,其指定返回的值的精度。第二个参数的语法和语义依赖于第一个字符是否为数值表达式、DATETIME 表达式或 DATE 表达式。
图: 负的、零和正的舍入因子的示例
SELECT order_num , ROUND(total_price) FROM items WHERE ROUND(total_price) = 124.00;
SELECT ROUND(125.46), ROUND(total_price) FROM items;
格式字符串 | 对返回的 DATETIME 值的影响 |
---|---|
'YEAR' | 舍入到最近一年之初,以六月 30 日之后的日期舍入到下一年。month、day、hour 和 minute 值舍入为 -01-01 00:00。 |
'MONTH' | 舍入到最近一月之初。将 15 日以后的日期舍入到下一月。day、hour 和 minute 值舍入为 01 00:00。 |
'DD' | 舍入到最近一天之初(00:00 = midnight)。将中午 12:00 之后的 DATETIME 舍入到下一天。 |
'DAY' | 舍入到最近的星期天之初。周三、周四、周五或周六的日期舍入到下一星期天。 |
'HH' | 舍入到最近一小时之初。以 minute:second 晚于 29:59 的时间值舍入到下一小时。分钟舍入为零。 |
'MI' | 舍入到最近一分钟之初。以 second 晚于 30 的时间值舍入到下一分钟。 |
如果您在初始的 DATETIME 表达式参数之后省略格式字符串规范,则返回的值是将第一个参数舍入到最近一天的值,就如同您已指定了 'DD' 作为格式字符串。
下列示例在 SELECT 语句中使用带有返回 DATETIME YEAR TO FRACTION(5) 值的列表达式的 ROUND 函数。在这些查询中,表 mytab 仅有单个行,且在那行中,mytab.col_dt 的值是 2012-12-07 14:30:12.12300。
SELECT ROUND(col_dt, 'YEAR') FROM mytab;返回的值为 2013-01-01 00:00。
SELECT ROUND(col_dt, 'YEAR')::DATE FROM mytab;返回的值为 01/01/2013。
SELECT ROUND(col_dt, 'MONTH') FROM mytab;返回的值为 2012-12-01 00:00。
SELECT ROUND(col_dt, 'HH') FROM mytab;返回的值为 2012-12-07 15:00。
要返回格式化的 DATE 值,您必须指定下列引用字符串之一作为 ROUND 函数的第二个参数:
格式字符串 | 对返回的 DATE 值的影响 |
---|---|
'YEAR' | 四舍五入到最近一年之初。一月 30 日之后的日期舍入到下一年。month 和 day 值均舍入为 01。 |
'MONTH' | 四舍五入到最近一月之初。15 日之后的日期舍入到下一月。返回的 day 值为 01。 |
'DD' | 返回第一个 date_expression 参数的 DATE 值。 |
'DAY' | 将该值舍入到最近的星期天。如果第一个参数为星期天,则返回那个日期。周三、周四、周五和周六的日期舍入到下一星期天。 |
当第一个参数为 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。
SELECT ROUND(TODAY, -2) FROM systables;在 2012 年 4 月 1 日,上述查询会返回整数值 40900。
在下一天,2012 年 4 月 2 日,同一查询会返回整数值 41000。
SELECT ROUND(TODAY, 'DD') FROM systables WHERE tabid = 1;
SELECT ROUND(TODAY, 'DAY') FROM mytab;返回的值为 03/31/2012,当前的日期四舍五入到最近的星期天。
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 格式规范的优先顺序。