数据类型
下表显示了 SQL 插件支持的数据类型,以及每种数据类型如何映射到 SQL 和 OpenSearch 数据类型
| OpenSearch SQL 类型 | OpenSearch 类型 | SQL 类型 |
|---|---|---|
| 布尔值 | 布尔值 | BOOLEAN |
| byte | byte | TINYINT |
| short | byte | SMALLINT |
| 整型 | 整型 | INTEGER |
| 长整型 (long) | 长整型 (long) | BIGINT |
| 浮点型 | 浮点型 | REAL |
| half_float | 浮点型 | FLOAT |
| scaled_float | 浮点型 | DOUBLE |
| 双精度浮点型 | 双精度浮点型 | DOUBLE |
| keyword | 字符串 | VARCHAR |
| text | text | VARCHAR |
| date | 时间戳 | TIMESTAMP |
| date_nanos | 时间戳 | TIMESTAMP |
| ip | ip | VARCHAR |
| binary | binary | VARBINARY |
| object | struct | STRUCT |
| nested | 数组 | STRUCT |
除了此列表之外,SQL 插件还支持 datetime 类型,尽管它没有与 OpenSearch 或 SQL 对应的映射。要使用没有相应映射的函数,您必须将数据类型显式转换为具有映射的类型。
日期和时间类型
日期和时间类型表示一个时间段:DATE、TIME、DATETIME、TIMESTAMP 和 INTERVAL。默认情况下,OpenSearch DSL 使用 date 类型作为唯一包含绝对时间点所有信息的日期时间相关类型。
为了与 SQL 集成,除了 timestamp 类型之外的每种类型都包含部分时间段信息。要使用日期时间函数,请参阅 datetime。某些函数可能对输入参数类型有约束。
日期
date 类型表示日历日期,与时区无关。给定的日期值是一个 24 小时周期,但此周期在不同时区会有所不同,并且在夏令时期间可能具有灵活的小时数。date 类型不包含时间信息,并且只支持 1000-01-01 到 9999-12-31 的范围。
| 类型 | 语法 | 范围 |
|---|---|---|
| date | yyyy-MM-dd | 0001-01-01 到 9999-12-31 |
时间
time 类型表示时钟时间,与时区无关。time 类型不包含日期信息。
| 类型 | 语法 | 范围 |
|---|---|---|
| time | hh:mm:ss[.fraction] | 00:00:00.0000000000 到 23:59:59.9999999999 |
Datetime
datetime 类型是日期和时间的组合。它不包含时区信息。有关包含日期、时间和时区信息的绝对时间点,请参阅 Timestamp。
| 类型 | 语法 | 范围 |
|---|---|---|
| datetime | yyyy-MM-dd hh:mm:ss[.fraction] | 0001-01-01 00:00:00.0000000000 到 9999-12-31 23:59:59.9999999999 |
时间戳
timestamp 类型是一个独立于时区或约定的绝对实例。例如,对于给定的时间点,如果您将时间戳更改为不同的时区,其值会相应改变。
timestamp 类型的存储方式与其他类型不同。它在存储时从当前时区转换为 UTC,并在检索时从 UTC 转换回其设置的时区。
| 类型 | 语法 | 范围 |
|---|---|---|
| 时间戳 | yyyy-MM-dd hh:mm:ss[.fraction] | 0001-01-01 00:00:01.9999999999 UTC 到 9999-12-31 23:59:59.9999999999 |
间隔
interval 类型表示时间持续时间或一个时间段。
| 类型 | 语法 |
|---|---|
| interval | INTERVAL expr unit |
expr 单位是任何最终迭代为数量值的表达式。它表示用于解释该数量的单位,包括 MICROSECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 和 YEAR。INTERVAL 关键字和单位说明符不区分大小写。
interval 类型有两种间隔类别:年-周间隔和日-时间隔。
- 年-周间隔存储年、季度、月和周。
- 日-时间隔存储日、小时、分钟、秒和微秒。
日期和时间类型之间的转换
除了 interval 类型之外,所有日期和时间类型都可以相互转换。转换可能会改变值或导致某些信息丢失。例如,从 datetime 值中提取 time 值,或将 date 值转换为 datetime 值等等。
SQL 插件支持每种类型的以下转换规则:
从日期转换
- 由于
date值不包含任何时间信息,因此转换为time类型没有用,并且总是返回零时间值00:00:00。 - 由于缺少时间信息,将
date转换为datetime会进行数据填充。它默认将时间00:00:00附加到原始日期,并形成一个datetime实例。例如,将2020-08-17转换为datetime类型的结果是2020-08-17 00:00:00。 - 转换为
timestamp类型会改变time值和timezone信息。它将零时间值00:00:00和会话时区(默认为 UTC)附加到日期。例如,将2020-08-17转换为具有会话时区 UTC 的datetime类型是2020-08-17 00:00:00 UTC。
从时间转换
- 您无法将
time类型转换为任何其他日期和时间类型,因为它不包含任何日期信息。
从 datetime 转换
- 将
datetime转换为date会从datetime值中提取日期值。例如,将2020-08-17 14:09:00转换为date类型的结果是2020-08-17。 - 将
datetime转换为time会从datetime值中提取时间值。例如,将2020-08-17 14:09:00转换为time类型的结果是14:09:00。 - 由于
datetime类型不包含时区信息,转换为timestamp类型会用会话时区填充时区值。例如,将2020-08-17 14:09:00(UTC) 转换为timestamp类型的结果是2020-08-17 14:09:00 UTC。
从时间戳转换
- 将
timestamp类型转换为date类型会提取日期值,转换为time类型会提取时间值。将timestamp类型转换为datetime类型仅提取datetime值并省略时区值。例如,将2020-08-17 14:09:00UTC 转换为date类型的结果是2020-08-17,转换为time类型的结果是14:09:00,转换为datetime类型的结果是2020-08-17 14:09:00。