FlinkSQL 时区问题

时间:2025-04-09 07:17:23

问题:

近期发现 Flink 的 Blink Planner 在 DATE_FORMATCURRENT_TIMESTAMP
做时间格式化为字符串时,默认以 UTC+0 为准。

长期以来,TableConfig 类里面有一个 setLocalTimeZone 方法;将其设置为东八区以后,发现格式化后的字符串仍然是 UTC+0
的。而深入来看,Flink 的时间格式化时的代码生成逻辑()并未考虑时区的设置。

由于大多数用户的时区均不是 UTC+0(GMT、UTC),如果时间格式化、显示等都可以考虑到 TableConfig 中的时区设置,那么 Flink
是否会更用户友好一些呢?当然这个会涉及到不兼容的变更,需要谨慎一些。

解答:

目前 localtimestamp 的实现看起来是没有问题的。可以先用 localtimestamp

在标准里面,以及一些常见数据库中(如 postgres1, oracle2),localtimestamp 是 without timezone 的实现,其值是 session zone 看到的值,等于 cast(current_timestamp as timestamp without time zone)。所以目前 localtimestamp 的实现应该是没有问题的。
举个例子,理论上,这两个函数的行为应该如下:

> SET time-zone=+08:00

> SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP;

                   EXPR$0          |           EXPR$1
   2020-03-26 09:51:42.299 +08:00  |  2020-03-26 09:51:42.299

目前 Flink 中的 LOCALTIMESTAMP 是符合预期的。


  1. /docs/9.5/#FUNCTIONS-DATETIME-CURRENT ↩︎

  2. /cd/B28359_01/server.111/b28286/#SQLRF00660 ↩︎