数据类型
下表显示了 SQL 插件支持的数据类型,以及每种类型如何映射到 SQL 和 UDB-SX 数据类型:
| UDB-SX SQL 类型 | UDB-SX 类型 | SQL 类型 |
|---|---|---|
| boolean | boolean | BOOLEAN |
| byte | byte | TINYINT |
| short | byte | SMALLINT |
| integer | integer | INTEGER |
| long | long | BIGINT |
| float | float | REAL |
| half_float | float | FLOAT |
| scaled_float | float | DOUBLE |
| double | double | DOUBLE |
| keyword | string | VARCHAR |
| text | text | VARCHAR |
| date | timestamp | TIMESTAMP |
| date_nanos | timestamp | TIMESTAMP |
| ip | ip | VARCHAR |
| binary | binary | VARBINARY |
| object | struct | STRUCT |
| nested | array | STRUCT |
除了此列表之外,SQL 插件还支持 datetime 类型,尽管它与 UDB-SX 或 SQL 没有相应的映射关系。
要使用没有相应映射关系的函数,必须显式将数据类型转换为具有映射关系的类型。
日期和时间类型
日期和时间类型表示一个时间段:DATE、TIME、DATETIME、TIMESTAMP 和 INTERVAL。默认情况下,UDB-SX 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 | 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 转换回其设置的时区。
| 类型 | 语法 | 范围 |
|---|---|---|
| timestamp | 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)附加到日期。例如,在会话时区为 UTC 的情况下,将2020-08-17转换为datetime类型的结果是2020-08-17 00:00:00 UTC。
从时间转换
由于
time类型不包含任何日期信息,不能将其转换为任何其他日期和时间类型。
从日期时间转换
将
datetime转换为date会从datetime值中提取日期值。例如,将2020-08-17 14:09:00转换为date类型的结果是2020-08-08。将
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。