实时计算Flink版作业支持配置时区参数调整时间类型数据的输出结果。本文为您介绍配置时区参数的方法。
配置时区参数
- 配置相同时区参数
- 配置不同时区参数
您可以对不同的源表或结果表配置不同的时区。例如,您需要读写的MySQL数据类型(例如TIME、DATE、TIMESTAMP类型)的时区为
America/New_York
,而作业计算需要的时区为Asia/Shanghai
,则可以通过如下方式单独配置源表或结果表的时区。CREATE TABLE mysql_source_my_table ( -- ... ) WITH ( timeZone='America/New_York' -- ... );
时区参数配置示例
实时计算Flink版时区相关函数语义上为自定义的时区。下文以
Asia/Shanghai
自定义时区为例进行说明。
- 字符串转时间类型(TO_TIMESTAMP、TIMESTAMP和UNIX_TIMESTAMP)
TO_TIMESTAMP('2020-08-03 10:59:45.957') -- 输出:`2020-08-03 10:59:45.957`。 TIMESTAMP '2020-08-03 10:59:45.957' -- 输出: `2020-08-03 10:59:45.957`。 UNIX_TIMESTAMP('2020-08-03 10:59:45.957') -- 输出: `1596423585`。
- 时间类型转字符串(DATE_FORMAT和FROM_UNIXTIME)
说明 当参数为TIMESTAMP时,输出结果取决于自定义设定的时区。
DATE_FORMAT(TO_TIMESTAMP(1596702949000), 'yyyy-MM-dd HH:mm:ss') -- 输出: `2020-08-06 16:35:49`。 DATE_FORMAT('2020-08-06 16:35:49', 'yyyy-MM-dd HH:mm:ss', 'yyyy/MM/dd HH:mm:ss') -- 输出: `2020/08/06 16:35:49` FROM_UNIXTIME(1596702949000/1000) -- 输出: `2020-08-06 16:35:49`
- 时间相关计算函数
当参数为TIMESTMP时,EXTRACT、FLOOR、CEIL和DATE_DIFF等函数输出结果取决于自定义的时区。
-- 1521503999000 2018-03-19T23:59:59+0000, 2018-03-20T07:59:59+0800 EXTRACT(DAY FROM TO_TIMESTAMP(1521503999000)) -- 输出: `20`,表示东八区的20日。
- 当前时间函数
当前时间函数包括
LOCALTIMESTAMP()
、CURRENT_TIMESTAMP()
、NOW()
和UNIX_TIMESTAMP()
等。-- 当前时间是2020-08-03 10:59:45 (Asia/Shanghai) LOCALTIMESTAMP -- 输出: `2020-08-03 10:59:45.957`。 CURRENT_TIMESTAMP -- 输出: `2020-08-03 10:59:45.957`。 NOW() -- 输出: `1596423585`。 UNIX_TIMESTAMP() -- 输出: `1596423585`。
- DATE和TIME类型
对于DATE和TIME类型,SQL内部使用整数进行显示和计算。DATE代表EPOCH DAYS,TIME代表用户时区,从当天的零点开始计算的毫秒数。如果UDF中对DATE和TIME进行计算,从内部类型转换到
java.sql.Date
或java.sql.Time
类型时,Java对象中已经完成了时区偏移操作。