INTERVAL
INTERVAL 数据类型
Lakehouse 提供了 INTERVAL 数据类型,用来表示两个日期或时间之间的时间间隔。本文为您介绍 INTERVAL 类型的使用方法和语法。
使用说明
INTERVAL 数据类型支持两种类型的间隔:
- INTERVAL_YEAR_MONTH:表示年月间隔,使用 YEAR 和 MONTH 字段存储时间间隔。
- INTERVAL_DAY_TIME:表示日间间隔,使用包括小数秒在内的天、小时、分钟和秒存储间隔。
INTERVAL_YEAR_MONTH
语法格式
| 语法 | 描述 | 示例 |
|---|---|---|
| INTERVAL '[+|-]y-m' YEAR TO MONTH | 同时指定 YEAR 和 MONTH 间隔 | INTERVAL '2-3' YEAR TO MONTH 表示 2 年 3 个月 |
| INTERVAL '[+|-]n' YEAR | 仅指定 YEAR 间隔 | INTERVAL '2' YEAR 表示 2 年 |
| INTERVAL '[+|-]n' MONTH | 仅指定 MONTH 间隔 | INTERVAL '3' MONTH 表示 3 个月 |
| INTERVAL '[+|-]n' QUARTER | 支持季度作为独立单位 | INTERVAL '4' QUARTER 表示 4 个季度(即 1 年) |
参数说明
- year:取值范围为 [0, 178956970]。
- month:取值范围为 [0, 11](在 YEAR TO MONTH 格式中)。
- quarter:季度单位标识。1 QUARTER = 3 MONTH。支持任意正整数或负整数,自动转换为 MONTH 进行计算。
注意事项
- 仅指定 MONTH 间隔时,month 取值可以超过 11,超过部分会折算为 YEAR。例如
INTERVAL '25' MONTH等同于 2 年 1 个月。 - INTERVAL_YEAR_MONTH 的最大值为
INTERVAL '178956970-7' YEAR TO MONTH(约 1.79 亿年)。
INTERVAL_DAY_TIME
语法格式
| 语法 | 描述 | 示例 |
|---|---|---|
| INTERVAL '[+|-]n' DAY | 仅指定 DAY 间隔 | INTERVAL '1' DAY 表示 1 天 |
| INTERVAL '[+|-]n' HOUR | 仅指定 HOUR 间隔 | INTERVAL '23' HOUR 表示 23 小时 |
| INTERVAL '[+|-]n' MINUTE | 仅指定 MINUTE 间隔 | INTERVAL '59' MINUTE 表示 59 分钟 |
| INTERVAL '[+|-]n' SECOND | 仅指定 SECOND 间隔 | INTERVAL '59.999' SECOND 表示 59.999 秒 |
| INTERVAL '[+|-]d h' DAY TO HOUR | 指定 DAY 和 HOUR | INTERVAL '1 23' DAY TO HOUR 表示 1 天 23 小时 |
| INTERVAL '[+|-]d h:m' DAY TO MINUTE | 指定 DAY、HOUR、MINUTE | INTERVAL '1 23:59' DAY TO MINUTE 表示 1 天 23 小时 59 分钟 |
| INTERVAL '[+|-]d h:m:s' DAY TO SECOND | 指定 DAY、HOUR、MINUTE、SECOND | INTERVAL '1 23:59:59.999' DAY TO SECOND 表示 1 天 23 小时 59 分 59.999 秒 |
| INTERVAL '[+|-]h:m' HOUR TO MINUTE | 指定 HOUR 和 MINUTE | INTERVAL '15:40' HOUR TO MINUTE 表示 15 小时 40 分钟 |
| INTERVAL '[+|-]h:m:s' HOUR TO SECOND | 指定 HOUR、MINUTE、SECOND | INTERVAL '15:40:32.999' HOUR TO SECOND 表示 15 小时 40 分 32.999 秒 |
| INTERVAL '[+|-]m:s' MINUTE TO SECOND | 指定 MINUTE 和 SECOND | INTERVAL '40:32.999' MINUTE TO SECOND 表示 40 分 32.999 秒 |
参数说明
- day:取值范围为 [0, 106751991]。
- hour:取值范围为 [0, 23](在复合格式中)。
- minute:取值范围为 [0, 59](在复合格式中)。
- second:取值范围为 [0, 59.999999999](在复合格式中)。
注意事项
- 仅指定 HOUR/MINUTE/SECOND 间隔时,对应参数的取值可以超过范围上限,超过的部分会被折算为更大的单位。
- INTERVAL_DAY_TIME 的最大值为
INTERVAL '106751991 04:00:54.775807' DAY TO SECOND。
多单位混合写法
支持在一个 INTERVAL 表达式中同时指定多个单位,系统会自动将各单位的值合并计算:
支持的单位包括:YEAR、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND(SECONDS)、MILLISECOND、MICROSECOND、NANOSECOND。
其中 WEEK 会自动转换为 7 天,MILLISECOND/MICROSECOND/NANOSECOND 会折算为秒的小数部分。
也可以使用字符串形式分段指定各单位的值:
表达式写法
允许 INTERVAL expr unit 形式,其中 expr 可以是任意表达式(不限于字面量),支持多单位混合:
宽松写法
INTERVAL 支持多种灵活的书写方式:
INTERVAL 类型的运算
INTERVAL 类型支持与数值类型、日期时间类型、字符串类型进行算术运算。
基本算术运算
INTERVAL 之间的运算
比较运算
数学函数
与 NULL 的运算
字符串与 INTERVAL 的运算
支持将符合 INTERVAL 格式的字符串与 INTERVAL 进行加减运算:
构造函数
make_ym_interval
构造 INTERVAL_YEAR_MONTH 类型的值:
make_dt_interval
构造 INTERVAL_DAY_TIME 类型的值:
注意事项
- INTERVAL_YEAR_MONTH 和 INTERVAL_DAY_TIME 是两种不同的类型,不能直接相加减。例如
interval '2-2' year to month + interval '3' day会报错。 - 不同类型的 INTERVAL 不能进行比较运算。例如
INTERVAL 1 MONTH > INTERVAL 20 DAYS会报错。 - INTERVAL 类型不支持存储到 Iceberg 格式的表中。
联系我们
