实时计算Flink版作业支持配置时区参数调整时间类型数据的输出结果。本文为您介绍配置时区参数的方法。

配置时区参数

  • 配置相同时区参数
    实时计算Flink版平台的作业参数中,您可以通过配置作业的时区(例如blink.job.timeZone=America/New_York)调整时间类型数据的输出结果。默认时区为东八区。
  • 配置不同时区参数
    您可以对不同的源表或结果表配置不同的时区。例如,您需要读写的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_TIMESTAMP)
    说明 当参数​为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.Datejava.sql.Time类型时,Java对象中已经完成了时区偏移操作。

支持的时区列表

实时计算Flink版支持的时区列表请参见TimeZone