ROUND 标量函数
ROUND 函数返回数字或日期时间值的舍入值。
ROUND 数字
ROUND 日期时间
该模式是 SYSIBM。 SYSFUN 版本的 ROUND numeric 函数继续可用。
- 如果第一个自变量的结果是数字值,那么 ROUND 函数将返回一个数字,四舍五入到小数点右边或左边的指定位数。
- 如果第一个自变量是 DATE , TIME 或 TIMESTAMP ,那么 ROUND 函数将返回一个日期时间值,四舍五入为 format-string指定的单位。
- ROUND 数字
如果 numeric-expression1 为正数,那么数字值 5 或更大的数字值指示舍入到下一个更高的正数。 例如, ROUND (3.5, 0) = 4。 如果 numeric-expression1 为负数,那么数字值 5 或更大表示舍入到下一个负数。 例如, ROUND (-3.5, 0) = -4。
- numeric-expression1
- 必须返回内置 CHAR , VARCHAR , GRAPHIC , VARGRAPHIC 或数字数据类型的值的表达式。 如果该值不是数字数据类型,那么在对函数求值之前,会将其隐式强制转换为 DECFLOAT (34)。
如果表达式是十进制浮点数据类型,那么将不使用 DECFLOAT 舍入方式。 ROUND 的舍入行为对应于值 ROUND_HALF_UP。 如果需要不同的舍入行为,请使用 QUANTIZE 函数。
- numeric-expression2
- 返回内置数字数据类型的值的表达式。 如果该值不是 INTEGER 类型,那么在对该函数进行求值之前,会将其隐式强制转换为 INTEGER。
如果 numeric-expression2 不为负数,那么会将 numeric-expression1 舍入为绝对值 numeric-expression2 小数点右边的位数。
如果 numeric-expression2 为负数,那么 numeric-expression1 将舍入为绝对值 numeric-expression2+ 1 小数点左侧的位数。
如果负 numeric-expression2 的绝对值大于小数点左侧的位数,那么结果为 0。 例如, ROUND (748.58, -4) = 0。 如果 numeric-expression1 为正数,那么会将数字值 5 舍入为下一个较高的正数。 如果 numeric-expression1 为负数,那么会将数字值 5 舍入为下一个负数。
结果的数据类型和长度属性与第一个自变量的数据类型和长度属性相同,但如果 numeric-expression1 为 DECIMAL 且精度小于 31 ,那么精度将增加 1。 例如,数据类型为 DECIMAL (5, $TAG1) 的自变量会生成 DECIMAL (6, 2)。 数据类型为 DECIMAL (31, $TAG1) 的自变量会生成 DECIMAL (31, 2)。 标度与第一个自变量的标度相同。
如果任一参数可以为空,或者 如果自变量不是十进制浮点数并且 数据库配置为 dft_sqlmathwarn 设置为 YES ,那么结果可以为空。 如果任一参数为空值,那么结果为空值。
此函数不受 CURRENT DECFLOAT 舍入方式专用寄存器的设置影响,即使对于十进制浮点自变量也是如此。 ROUND 的舍入行为对应于值 ROUND_HALF_UP。 如果想要符合 CURRENT DECFLOAT 舍入方式专用寄存器指定的舍入方式的十进制浮点值的行为,请改为使用 QUANTIZE 函数。
- ROUND datetime
- 如果 datetime-表达式 具有日期时间数据类型,那么 ROUND 函数将返回 datetime-表达式 舍入到 format-字符串指定的单元。 如果未指定 format-字符串 ,那么会将 datetime-表达式 舍入为最接近的日期,就像为 format-字符串指定了 "DD" 一样。
- datetime-expression
- 必须返回日期,时间或时间戳记值的表达式。 这些数据类型的字符串表示不受支持,必须显式地强制转换为 DATE , TIME 或 TIMESTAMP 才能与此函数配合使用; 或者,可以将 ROUND_TIMESTAMP 函数用于日期或时间戳记的字符串表示。
- format-string
- 返回一个实际长度不大于 255 bytes的内置字符串数据类型的表达式。 format-string 中的 format 元素指定应如何对 datetime-expression 进行舍入。 例如,如果 format-string 为 "DD" ,那么会将 datetime-expression 表示的时间戳记舍入为最接近的日期。 将从字符串中除去前导和尾部空格,并且生成的子串必须是 datetime-expression 类型的有效格式元素 (SQLSTATE 22007)。 缺省值为 "DD" ,如果 datetime-expression 的数据类型为 TIME ,那么不能使用该值。
format-string 的允许值列示在 表 1中列出的格式元素表中。
- locale-name
- 一个字符常量,用于指定使用格式元素值 DAY , DY 或 D 时用于确定一周的第一天的语言环境。 语言环境名称 的值不区分大小写,并且必须是有效的语言环境 (SQLSTATE 42815)。 有关有效语言环境及其命名的信息,请参阅
SQL 和 XQuery 的语言环境名称
。 如果未指定 locale-name ,那么将使用专用寄存器 CURRENT LOCALE LC_TIME 的值。
以下格式元素用于标识 ROUND , ROUND_TIMESTAMP , TRUNCATE 和 TRUNC_TIMESTAMP 函数中日期时间值的舍入或截断单位。
表 1. ROUND , ROUND_TIMESTAMP , TRUNCATE 和 TRUNC_TIMESTAMP 的格式元素 格式元素 舍入或截断单位 ROUND 示例 TRUNCATE 示例 抄送
SCC世纪 超过一个世纪的第 50 年后(例如,在 1951-01-01-00.00.00),向上舍入到下一个世纪起始。
不适用于 TIME 自变量。
输入值:
1897-12-04-12.22.22.000000结果:
1901-01-01-00.00.00.000000输入值:
1897-12-04-12.22.22.000000结果:
1801-01-01-00.00.00.000000SYYYY
YYYY
YEAR
SYEAR
YYY
YY
Y年 从 7 月 1 日开始,向上舍入到下一年的 1 月 1 日。
不适用于 TIME 自变量。
输入值:
1897-12-04-12.22.22.000000结果:
1898-01-01-00.00.00.000000输入值:
1897-12-04-12.22.22.000000结果:
1897-01-01-00.00.00.000000IYYY
IYY
IY
IISO 年 从 7 月 1 日开始,向上舍入到下一个 ISO 年的第一天。 ISO 年的第一天定义为第一个 ISO 周的星期一。
不适用于 TIME 自变量。
输入值:
1897-12-04-12.22.22.000000结果:
1898-01-03-00.00.00.000000输入值:
1897-12-04-12.22.22.000000结果:
1897-01-04-00.00.00.000000Q 季度 在一个季度第二个月的第 16 天开始向上舍入到下个季度。
不适用于 TIME 自变量。
输入值:
1999-06-04-12.12.30.000000结果:
1999-07-01-00.00.00.000000输入值:
1999-06-04-12.12.30.000000结果:
1999-04-01-00.00.00.000000MONTH
MON
MM
RM月 在一个月的第 16 天开始向上舍入到下个月。
不适用于 TIME 自变量。
输入值:
1999-06-18-12.12.30.000000结果:
1999-07-01-00.00.00.000000输入值:
1999-06-18-12.12.30.000000结果:
1999-06-01-00.00.00.000000全球 一周中作为一年的第一天的日期。 从与一年的第一天相对应的一周的第 4 天第 12 个小时开始向上舍入到下一周。
不适用于 TIME 自变量。
输入值:
2000-05-05-12.12.30.000000结果:
2000-05-06-00.00.00.000000输入值:
2000-05-05-12.12.30.000000结果:
2000-04-29-00.00.00.000000IW 一周中作为一个 ISO 年的第一天的日期。 有关详细信息,请参阅 WEEK_ISO 标量函数
。从与 ISO 年的第一天相对应的一周的第 4 天第 12 个小时开始向上舍入到下一周。
不适用于 TIME 自变量。
输入值:
2000-05-05-12.12.30.000000结果:
2000-05-08-00.00.00.000000输入值:
2000-05-05-12.12.30.000000结果:
2000-05-01-00.00.00.000000W 一周中作为一个月的第一天的日期。 从与一个月的第一天相对应的一周的第 4 天第 12 个小时开始向上舍入到下一周。
不适用于 TIME 自变量。
输入值:
2000-06-21-12.12.30.000000结果:
2000-06-22-00.00.00.000000输入值:
2000-06-21-12.12.30.000000结果:
2000-06-15-00.00.00.000000DDD
DD
J日 在一天的第 12 个小时开始向上舍入到第二天。
不适用于 TIME 自变量。
输入值:
2000-05-17-12.59.59.000000结果:
2000-05-18-00.00.00.000000输入值:
2000-05-17-12.59.59.000000结果:
2000-05-17-00.00.00.000000DAY
DY
D一周的开始日期。 与一周第 4 天第 12 个小时相对应的日期开始向上舍入到下一周。 一周的第一天取决于语言环境(请参阅 locale-name)。
不适用于 TIME 自变量。
输入值:
2000-05-17-12.59.59.000000结果:
2000-05-21-00.00.00.000000输入值:
2000-05-17-12.59.59.000000结果:
2000-05-14-00.00.00.000000HH
HH12
HH24Hour 从 30 分钟开始向上舍入到下一个小时。
输入值:
2000-05-17-23.59.59.000000结果:
2000-05-18-00.00.00.000000输入值:
2000-05-17-23.59.59.000000结果:
2000-05-17-23.00.00.000000MI 分钟 从 30 秒开始向上舍入到下一分钟。
输入值:
2000-05-17-23.58.45.000000结果:
2000-05-17-23.59.00.000000输入值:
2000-05-17-23.58.45.000000结果:
2000-05-17-23.58.00.000000SS 秒 半秒就轮到你了
输入值:
2000-05-17-23.58.45.500000结果:
2000-05-17-23.58.46.000000输入值:
2000-05-17-23.58.45.500000结果:
2000-05-17-23.58.45.000000注: 必须以大写形式指定 表 1 中的格式元素。如果为日期参数指定了应用于值的时间部分的格式元素,那么将返回未更改的日期参数。 如果为时间自变量指定了对时间自变量无效的格式元素,那么将返回错误 (SQLSTATE 22007)。
注意
- 确定性: ROUND 是确定性函数。 但是,函数的以下调用取决于专用寄存器 CURRENT LOCALE LC_TIME 的值。
- 在未显式指定 locale-name 并且下列其中一项为 true 时对日期时间值进行舍入:
- format-string 不是常量
- format-string 是一个常量,并且包含语言环境敏感的格式元素
- 在未显式指定 locale-name 并且下列其中一项为 true 时对日期时间值进行舍入:
示例
- 示例 1: 计算 873.726的值,分别舍入为 2 , 1 , 0 , -1 , -2 , -3 和 -4 位小数。
此示例返回:VALUES ( ROUND(873.726, 2), ROUND(873.726, 1), ROUND(873.726, 0), ROUND(873.726,-1), ROUND(873.726,-2), ROUND(873.726,-3), ROUND(873.726,-4) )1 2 3 4 5 6 7 --------- --------- --------- --------- --------- --------- --------- 873.730 873.700 874.000 870.000 900.000 1000.000 0.000 - 示例 2: 使用正数和负数计算。
此示例返回:VALUES ( ROUND(3.5, 0), ROUND(3.1, 0), ROUND(-3.1, 0), ROUND(-3.5,0) )1 2 3 4 ---- ---- ---- ---- 4.0 3.0 -3.0 -4.0 - 示例 3: 计算十进制浮点数 3.12350 舍入为小数点后三位。
此示例返回:VALUES ( ROUND(DECFLOAT('3.12350'), 3))1 ----- 3.12400 - 示例 4: 设置输入日期舍入为最接近月份值的主变量 RND_DT。
值集为 2000-09-01。SET :RND_DATE = ROUND(DATE('2000-08-16'), 'MONTH'); - 示例 5: 设置主变量 RND_TMSTMP ,并将输入时间戳记舍入为最接近的年份值。
值集为 2001-01-01-00.00.00.000000。SET :RND_TMSTMP = ROUND(TIMESTAMP('2000-08-14-17.30.00'), 'YEAR');
