数据类型
下表显示了 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:00
UTC 转换为date
类型的结果是2020-08-17
,转换为time
类型的结果是14:09:00
,转换为datetime
类型的结果是2020-08-17 14:09:00
。