在 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 转换为 BIGINT
CAST(timestamp_field as BIGINT) as bigint_field

-- BIGINT TO TIMESTAMP

CAST(bigint_field as TIMESTAMP) as timestamp_field

------------------------------------


-- 在 Flink 1.14 之后

-- TIMESTAMP TO BIGINT
-- 1. TIMESTAMP TO BIGINT
cast(TIMESTAMP as STRING) as string_field
-- 2. STRING TO BIGINT
UNIX_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss') as bigint_field

-- BIGINT TO TIMESTAMP
-- 1. BIGINT TO STRING
FROM_UNIXTIME(bigint_field, 'yyyy-MM-dd hh:mm:ss') as string_field
-- 2.STRING TO TIMESTAMP
TO_TIMESTAMP(string_field)

TIMESTAMP <-> STRING

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

-- 将 TIMESTAMP 类型按照指定的格式转换为 STRING

DATE_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 转换为 时间戳 BIGINT
DATE_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 按照指定格式转换为 STRING

DATE_FORMAT(timestamp_ltz_field, 'yyyy-MM-dd hh:mm:ss')


-- 将 STRING 转换为 TIMESTAMP_LTZ
-- 1. 将 STRING 转换为 BIGINT 时间戳
-- 2. 将 BIGINT 转换为 TIMESTAMP_LTZ
UNIX_TIMESTAMP(string_field, 'yyyy-MM-dd hh:mm:ss') as bigint_field;

TO_TIMESTAMP_LTZ(bigint_field, 3);

OTHER

BIGINT <-> STRING

-- 将时间戳 BIGINT 直接格式化为 STRING
FROM_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)