如何在 flink SQL 中使用 ISO-8601 日期?

How to use ISO-8601 date in flink SQL?

根据我的研究,Flink SQL 接受“0000-01-01 00:00:00.000000000” 作为时间戳格式,但我在 kafka 中的时间戳是“0000-01-01T00:00:00.000000000" 格式导致 flink sql 查询失败。

有没有办法将日期的一种有点常见的格式(例如 2022-05-02T18:28:07.881414Z)转换为 flink 中所需的格式?在其他 SQL 语言中,这将是一个非常简单的操作,但是通过阅读 Flink 文档我看不出有什么方法可以做到这一点。

我尝试进行字符串替换并将字符串转换为时间戳,但没有成功。我是 运行 Flink 1.13.

我尝试使用 CONVERT_TZ() 但它不适用于字符串时间戳:

这个有效:

SELECT
  CONVERT_TZ(string_ts, 'UTC', 'America/Los_Angeles') as test_ts
FROM
  (VALUES ('2022-05-02 18:28:07.881414Z')) AS NameTable(string_ts);

这行不通:

SELECT
  CONVERT_TZ(string_ts, 'UTC', 'America/Los_Angeles') as test_ts
FROM
  (VALUES ('2022-05-02T18:28:07.881414Z')) AS NameTable(string_ts);

这给了我一个时间戳,但我对更改时区不感兴趣。如何将带有替换的字符串转换为可与其他时间戳函数一起使用的时间戳?比如时间戳 diff:

SELECT
    TO_TIMESTAMP(replace(string_ts, 'T', ' ')) -- gives null
    , CONVERT_TZ(replace(string_ts, 'T', ' '), 'UTC', 'America/Los_Angeles') -- works
FROM
  (VALUES ('2022-05-02T18:28:07.881414Z')) AS NameTable(string_ts);

如何让 Flink 将“2022-05-02T18:28:07.881414Z”识别为时间戳?

如果您使用 JSON 格式来摄取此数据,则可以设置此选项

json.timestamp-format.standard: ISO-8601

告诉 Flink 如何解释字符串。 https://nightlies.apache.org/flink/flink-docs-stable/docs/connectors/table/formats/json/#json-timestamp-format-standard.

的文档中对此进行了描述

如果您需要使用 Flink SQL 将 ISO-8601 字符串转换为时间戳,您可能会发现 CONVERT_TZ(string1, string2, string3) 很有帮助,或者您可能更愿意将此转换实现为 user-defined 函数。