数据类型

下表显示了 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 没有相应的映射关系。 要使用没有相应映射关系的函数,必须显式将数据类型转换为具有映射关系的类型。

日期和时间类型

日期和时间类型表示一个时间段:DATETIMEDATETIMETIMESTAMPINTERVAL。默认情况下,UDB-SX DSL 使用 date 类型作为唯一与日期时间相关的类型,它包含绝对时间点的所有信息。

为了与 SQL 集成,除 timestamp 类型外的每种类型都包含部分时间段信息。要使用日期时间函数,请参阅 datetime。某些函数可能对输入参数类型有限制。。

日期

date 类型表示日历日期,与时区无关。一个给定的日期值是一个 24 小时周期,但这个周期在不同时区中会有所不同,并且在夏令时计划期间可能有灵活的时长。date 类型不包含时间信息,仅支持 1000-01-019999-12-31 的范围。

类型 语法 范围
date yyyy-MM-dd 0001-01-019999-12-31

时间

time 类型表示时钟时间,与其时区无关。time 类型不包含日期信息。

类型 语法 范围
time hh:mm:ss[.fraction] 00:00:00.000000000023:59:59.9999999999

日期时间

datetime 类型是日期和时间的组合。它不包含时区信息。对于包含日期、时间和时区信息的绝对时间点,请参阅 时间戳

类型 语法 范围
datetime yyyy-MM-dd hh:mm:ss[.fraction] 0001-01-01 00:00:00.00000000009999-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 单位是任何最终迭代为数量值的表达式。它表示用于解释数量的单位,包括 MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARINTERVAL 关键字和单位说明符不区分大小写。

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:00 UTC 转换为 date 类型的结果是 2020-08-17,转换为 time 类型的结果是 14:09:00,转换为 datetime 类型的结果是 2020-08-17 14:09:00