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

配置时区参数

  • 配置相同时区参数
    实时计算平台的作业参数中,您可以通过配置作业的时区(例如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'
     -- ... 
    )

时区参数配置示例

实时计算时区相关函数语义上为自定义的时区。本示例以自定义时区为Asia/Shanghai进行说明。
  • 字符串转时间类型(TO_TIMESTAMP、TIMESTAMP和UNIX_TIMESTAMP)
    -- Scalar function 
    TO_TIMESTAMP("2018-03-14 19:01:02.123") 
    -- SQL Literal 
    
    TIMESTAMP '2018-03-14 19:01:02.123' 
    -- 输出:  `1521025262123`。
    -- 类似的还有 UNIX_TIMESTAMP,区别是单位为秒。
  • 时间类型转字符串(FROM_TIMESTAMP和DATA_FORMAT)
    说明 当参数​为TIMESTAMP时,输出结果取决于自定义设定的时区。
    SELECT DATE_FORMAT(TO_TIMESTAMP(1520960523000), 'yyyy-MM-dd HH:mm:ss') 
    -- 输出: `2018-03-14 01:02:03`。
    
    DATE_FORMAT('2018-03-14 01:02:03', 'yyyy-MM-dd HH:mm:ss', 'yyyy/MM/dd HH:mm:ss') 
    FROM_UNIXTIME(1521025200000/1000) 
    -- 输出: `2018-03-14 19:00:00`。
  • 时间相关计算函数
    当参数​为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()等。
    -- 当前时间是 2018-04-03 16:56:10 (Asia/Shanghai) 
    SELECT DATE_FORMAT(CURRENT_TIMESTAMP, ‘yyyy-MM-dd HH:mm:ss’); 
    -- 输出: `2018-04-03 16:56:10`。 
    
    SELECT DATE_FORMAT(LOCALTIMESTAMP, ‘yyyy-MM-dd HH:mm:ss’); 
    -- 输出: `2018-04-03 16:56:10`。 
    
    SELECT FROM_UNIXTIME(NOW()); SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()); 
    -- 输出: `2018-04-03 16:56:10`。 
  • DATA和TIME类型

    对于DATE和TIME类型,SQL内部用整数进行显示和计算。DATE指的是EPOCH DAYS;TIME指的是用户时区,从当天的零点开始计算的毫秒数。如果UDF中对DATE和TIME进行计算,从内部类型转换到java.sql.Datejava.sql.Time类型时,Java对象中已经完成了时区偏移操作。

支持的时区列表

实时计算支持的时区列表参见附件TimeZone