INTERVAL 标量函数
INTERVAL 函数将时间间隔的字符串表示转换为十进制持续时间。
该模式是 SYSIBM。
语法
- string-constant
- 字符串表示法时间间隔,例如:
'4 years 2 months 3 days' '3 day 4 year 2 month' '-4y -2 m -3d' '-2 hr -21 min -34sec' '4years 2months 3 days 2 hours 21minutes 34seconds 75 milliseconds 27 microseconds' '2 mons 3 days 4 yrs 2 hrs 20 mins 30 secs 75 ms 27 us'注:- 输入必须是字符串常量,而不是表达式或列值(带有 SQLSTATE=42815 的 sqlcode SQL0171N )。
- 每个值与其单位关键字之间的空格是可选的。
- 值必须全部为正或全部为负。
- 单元关键字不区分大小写。
- 单元关键字的顺序不重要。
- 单元关键字不能使用多次。
- 以下语句等价:
INTERVAL (string-constant) CAST (string-constant as INTERVAL)
指定的时间间隔可以是下列其中一种类型:- 时间间隔
- 输入值不包含小时,分钟或秒以外的单位,并且不能超过等效于
'99h 99m 99s'(带有 SQLSTATE=42604的 sqlcode SQL0105N )。 超过 99 的分钟值将转换为小时,超过 99 的秒值将转换为分钟。 例如,100 秒转换为 1 分钟 40 秒。 - 更新时间间隔
- 输入值不包含除年,月或日以外的单位,并且不能超过等效于
'9999y 99m 99d'(带有 SQLSTATE=42604的 sqlcode SQL0105N )。 超过 99 个月的值将转换为年数,超过 99 天的值将转换为月数(30 天)。 例如,100 天将转换为 3 个月和 10 天。 - 时间戳记间隔
- 输入值不能超过等效于
'9999y 99m 99d 99h 99m 99s 999999us'(带有 SQLSTATE=42604的 sqlcode SQL0105N )。 毫秒和微秒值在求值前合并为单个微秒值。 如果结果值超过 999999 微秒,那么它将转换为秒。 例如,'88 ms 5000000 us'将转换为 5088000 微秒。 这超过 999999 微秒,因此它将转换为 5.088000 秒。 超过 99 的秒值将转换为分钟数。 超过 99 的分钟值将转换为小时数。 超过 99 的小时值将转换为天数。 超过 99 的天数值将转换为月数(30 天)。 超过 99 的月值将转换为年数。
| 关键字 | 指定 ... 时允许的最大值 | ||
|---|---|---|---|
| 时间间隔 | 更新时间间隔 | 时间戳记间隔 | |
| 年,年,年,年 | (不允许) | 9999 | 9999 |
| 月,月,月,月 | (不允许) | 119999 | 119999 |
| 日,日,日 | (不允许) | 3599999 | 3599999 |
| 小时,小时,小时,小时 | 99 | (不允许) | 86399999 |
| 分钟,分钟,分钟,分钟,分钟 | 5999 | (不允许) | 2147483647 |
| 秒,秒,秒,秒 | 359999 | (不允许) | 2147483647 |
| 毫秒,毫秒,毫秒 | (不允许) | (不允许) | 2147483647 |
| 微秒,微秒,微秒 | (不允许) | (不允许) | 2147483647 |
结果
结果的数据类型取决于输入时间间隔的类型。 如果输入值表示:
- 日期时间间隔,结果是日期持续时间,值为 DECIMAL (8,0)。
- 时间间隔,结果是持续时间,值为 DECIMAL (6,0)。
- 时间戳记时间间隔,结果是时间戳记持续时间,为 DECIMAL 值。 此值的精度取决于在将毫秒和微秒值合并为单个微秒值之后,然后将超过 999999 微秒的任何微秒转换为秒后,剩余的微秒数为零:
- 如果是,那么结果为 DECIMAL (14,0)
- 如果不是,那么结果为 DECIMAL (20,6)
示例
- 以下语句返回 DECIMAL (8,0) 值 40203:
interval('4years 2months 3days') - 以下语句返回 DECIMAL (6,0) 值 122030:
interval('-12 hours -20 minutes -30 seconds') - 以下语句返回 DECIMAL (20,6) 值 40801092630.007055:
interval('4 years 9 hour 26min 30 seconds 7 ms 55us 8months 1d') - 以下语句返回 DECIMAL (14,0) 值 22035:
毫秒 (1500) 和微秒 (3500000) 值合并为单个微秒值 (5000000),然后对它们进行求值。 生成的值超过 999999 微秒,因此将其转换为 5 秒,这将添加到指定的 30 秒中,总计 35 秒。interval('2 hours 20 minutes 30 seconds 1500 ms 3500000 us') - 以下语句返回 DECIMAL (8,0) 值 90714,它对应于 9 年,7 个月和 14 天。
由于天数超过 99 天,因此 104 天将转换为 3 个 30 天,外加剩余的 14 天。 将 3 个月添加到指定的 100 个月内,共计 103 个月。 由于月数超过 99 个月,因此 103 个月改为 8 个 12 个月,外加剩余的 7 个月。 8 年加至指定的 1 年,共计 9 年。interval('1 years 100 months 104 days') - 以下语句返回 DECIMAL (6,0) 值 230120 ,它对应于 23 小时,1 分钟和 20 秒。
因为分钟数超过 99,所以 181 分将转换为 3 小时,加上剩余的 1 分钟。 将 3 小时加至指定的 20 小时,共 23 小时。interval('20 hours 181 minutes 20 seconds')
