最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

速读:FlinkSQL 时间类型转化使用小结

来源:博客园


(相关资料图)

https://blog.noname.cc/2023/01/16/20230116/

在 Flink SQL 中,存在两种时间类型, 分别是 TIMESTAMP 和 TIMESTAMP_LTZ.

以下示例所用的字段: TIMESTAMP_FIELD, TIMESTAMP_LTZ_FIELD, BIGINT_FIELD, STRING_FIELD 分别代表对应类型的字段.

TIMESTAMP

TIMESTAMP <-> BIGINT

-- 在 Flink 1.14 之前-- TIMESTAMP TO BIGINT-- 在 Flink 1.14 之前 直接使用 cast 将 TIMESTAMP 转换为 BIGINTCAST(timestamp_field as BIGINT) as bigint_field-- BIGINT TO TIMESTAMPCAST(bigint_field as TIMESTAMP) as timestamp_field-------------------------------------- 在 Flink 1.14 之后DATE_FORMAT(TIMESTAMP, "yyyy-MM-dd hh:mm:ss") as string_field-- UNIX_TIMESTAMP 默认会使用 local time-zone, 而 DATE_FORMAT 默认会使用 UTC-0 时区的时间, 使用 UNIX_TIMESTAMP 前应该使用 CONVERT_TIMEZONE 将 UTC-0 转换为 local time-timezoneCONVERT_TZ(string_field, "UTC", "Asia/Shanghai") as string_fieldUNIX_TIMESTAMP(string_field, "yyyy-MM-dd hh:mm:ss") as bigint_field-- BIGINT TO TIMESTAMPFROM_UNIXTIME(bigint_field, "yyyy-MM-dd hh:mm:ss") as string_field-- FROM_UNIXTIME 默认会使用 local time-zone, 而 TO_TIMESTAMP 默认会使用 UTC-0 时区的时间, 使用 TO_TIMESTAMP 前应该使用 CONVERT_TIMEZONE 转换为 UTC-0 时区CONVERT_TZ(string_field, "Asia/Shanghai", "UTC") as string_fieldTO_TIMESTAMP(string_field, "yyyy-MM-dd hh:mm:ss") as timestamp_field

TIMESTAMP <-> STRING

TIMESTAMP 和 STRING 进行互转时, 使用的都是 UTC-0 时区

-- 将 TIMESTAMP 类型按照指定的格式转换为 STRINGDATE_FORMAT(timestamp_field, "yyyy-MM-dd hh:mm:ss")-- 将 STRING 类型字段转换为 TIMESTAMP 类型 TO_TIMESTAMP(string_field, "yyyy-MM-dd hh:mm:ss")

TIMESTAMP_LTZ

TIMESTAMP_LTZ <-> BIGINT

-- 将 TIMESTAMP_LTZ 类型转换为 BIGINT-- 1. 将 TIMESTAMP_LTZ 按照指定格式转换为 STRING-- 2. 将 STRING 转换为 时间戳 BIGINTDATE_FORMAT(timestamp_ltz_field, "yyyy-MM-dd hh:mm:ss") as string_field;UNIX_TIMESTAMP(string_field, "yyyy-MM-dd hh:mm:ss")-- 将 BIGINT 转换为 TIMESTAMP_LTZ-- 直接使用 TO_TIMESTAMP_LTZ 函数TO_TIMESTAMP_LTZ(bigint_field, 3);

TIMESTAMP_LTZ -> STRING

-- 将 TIMESTAMP_LTZ 按照指定格式转换为 STRINGDATE_FORMAT(timestamp_ltz_field, "yyyy-MM-dd hh:mm:ss")-- 将 STRING 转换为 TIMESTAMP_LTZ-- 1. 将 STRING 转换为 BIGINT 时间戳-- 2. 将 BIGINT 转换为 TIMESTAMP_LTZUNIX_TIMESTAMP(string_field, "yyyy-MM-dd hh:mm:ss") as bigint_field;TO_TIMESTAMP_LTZ(bigint_field, 3);

OTHER

BIGINT <-> STRING

-- 将时间戳 BIGINT 直接格式化为 STRINGFROM_UNIXTIME(bigint_field, "yyyy-MM-dd hh:mm:ss") as string_field-- 将 STRING 转换为 BIGINT 类型UNIX_TIMESTAMP(string_field, "yyyy-MM-dd hh:mm:ss") as bigint_field

TIMESTAMP <-> TIMESTAMP_LTZ

-- 可以直接 cast ,但是要注意时区的转换CAST(timestamp_field as TIMESTAMP_LTZ)CAST(timestamp_ltz_field as TIMESTAMP)

关键词: 时间类型 分别代表 但是要注意