FROM_UTC_TIMESTAMP

FROM_UTC_TIMESTAMP函数用于将一个UTC时区的时间戳转换成一个指定时区的时间戳,即将一个UTC时区的时间戳按照指定的时区显示。

注意事项

为确保时区处理的清晰性与一致性,推荐使用TO_TIMESTAMP_NTZ函数。避免由于FROM_UTC_TIMESTAMP函数在处理时区时导致的返回结果不符合预期。

命令格式

TIMESTAMP FROM_UTC_TIMESTAMP (BIGINT|STRING|DATETIME|TIMESTAMP|TIMESTAMP_NTZ <timestamp>, STRING <time_zone>)

参数说明

  • timestamp:必填。待转换的时间戳。支持BIGINT、STRING、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型。

    • 如果输入为STRING类型,日期格式需包含yyyy-mm-ddyyyy-mm-dd hh:mi:ss

    • 如果输入为BIGINT类型的毫秒值,系统会以 1970-01-01 00:00:00 UTC 为起点加上毫秒值,再根据当前Session/Project时区设置进行时区偏移,作为输入时间戳。

  • time_zone:必填。用于指定需要转换的目标时区。STRING类型。

返回值说明

返回TIMESTAMP类型指定时区的时间戳。返回规则如下:

  • timestampBIGINT、STRING、DATETIME、TIMESTAMPTIMESTAMP_NTZ类型,返回报错。

  • timestamp为不符合格式要求的STRING类型,返回NULL。

  • timestampNULL,返回报错。

  • time_zoneNULL,返回NULL。

使用示例

  • 示例1:当输入参数为BIGINT时,系统会以 1970-01-01 00:00:00 UTC 为起点加上毫秒值,再根据当前Session/Project时区设置进行时区偏移,作为输入时间戳。

    -- 设置Session/Project时区为Asia/Shanghai时
    SET odps.sql.timezone = Asia/Shanghai;
    SELECT  FROM_UTC_TIMESTAMP(0, 'Asia/Shanghai') AS TIMESTAMP1
            ,FROM_UTC_TIMESTAMP(1230000,'Etc/GMT') AS TIMESTAMP2
            ,FROM_UTC_TIMESTAMP(-1230000,'Etc/GMT') AS TIMESTAMP3;
    -- 返回:
    +---------------------+---------------------+---------------------+
    | timestamp1          | timestamp2          | timestamp3          |
    +---------------------+---------------------+---------------------+
    | 1970-01-01 16:00:00 | 1970-01-01 08:20:30 | 1970-01-01 07:39:30 |
    +---------------------+---------------------+---------------------+
    
    
    -- 设置Session/Project时区为Etc/GMT
    SET odps.sql.timezone = Etc/GMT;
    SELECT  FROM_UTC_TIMESTAMP(0, 'Asia/Shanghai') AS TIMESTAMP1
            ,FROM_UTC_TIMESTAMP(1230000,'Etc/GMT') AS TIMESTAMP2
            ,FROM_UTC_TIMESTAMP(-1230000,'Etc/GMT') AS TIMESTAMP3;
    -- 返回:
    +---------------------+---------------------+---------------------+
    | timestamp1          | timestamp2          | timestamp3          |
    +---------------------+---------------------+---------------------+
    | 1970-01-01 08:00:00 | 1970-01-01 00:20:30 | 1969-12-31 23:39:30 |
    +---------------------+---------------------+---------------------+
  • 示例2:当输入参数为其他类型时,函数将时间戳从UTC时区转换为指定时区时间戳并返回,此时输出与输出时间戳均与Session/Project时区设置无关。

    -- 设置Session/Project时区值,对输入与输出时间戳无影响
    SET odps.sql.timezone = Asia/Shanghai;
    
    -- 返回 2025-08-31 09:00:00
    SELECT FROM_UTC_TIMESTAMP('2025-08-31', 'Asia/Seoul');
    
    -- 返回 2025-03-05 23:30:15
    SELECT FROM_UTC_TIMESTAMP('2025-03-05 15:30:15','Asia/Shanghai');
    
    -- 返回 2025-03-05 08:00:00.123456789
    SELECT FROM_UTC_TIMESTAMP('2025-03-05 00:00:00.123456789','Asia/Shanghai');
    
    -- 返回 2025-03-04 16:00:00
    SELECT FROM_UTC_TIMESTAMP(DATETIME '2025-03-05 00:00:00','PST');
    
    -- 返回 2025-03-06 00:30:15.123
    SELECT FROM_UTC_TIMESTAMP(TIMESTAMP '2025-03-05 15:30:15.123','Asia/Seoul');
    
    -- 返回 2025-03-05 23:30:15.123
    SELECT FROM_UTC_TIMESTAMP(TIMESTAMP_NTZ '2025-03-05 15:30:15.123','Asia/Shanghai');
说明

若使用MaxCompute客户端执行,当use_instance_tunneltrue时,可能出现 odpscmdlogview的两边返回结果的屏显不一致的情况,结果请以logview里的result为准。

相关函数

FROM_UTC_TIMESTAMP函数属于日期函数,更多日期计算、日期转换的相关函数请参见日期函数