【问题标题】:How to convert epoch time to Human readable in Teradata如何在 Teradata 中将纪元时间转换为人类可读
【发布时间】:2015-10-12 14:04:13
【问题描述】:

在我的 Teradata 表中,dhTimestamp 列下有纪元时间戳

dhTimestamp  
1435308067705  
1434965874565  
1434763800794  
1434775876034  
1434765207057  

如何在 Teradata 上将纪元时间戳转换为人类日期/时间格式?

【问题讨论】:

    标签: teradata epoch


    【解决方案1】:

    这是标准 unixtime 的 SQL UDF:

    /**********
    Converting Unix/POSIX time to a Timestamp 
    
    Unix time: Number of seconds since 1970-01-01 00:00:00 UTC not counting leap seconds (currently 24 in 2011)
    
    Also working for negative numbers.
    The maximum range of Timestamps is based on the range of INTEGERs:
    1901-12-13 20:45:52 (-2147483648) to 2038-01-19 03:14:07 (2147483647)
    
    Can be changed to use BIGINT instead of INTEGER
    
    20101211 initial version - Dieter Noeth
    **********/
    
    REPLACE FUNCTION Epoch2Timestamp (UnixTime INT)
    RETURNS TimeStamp(0)
    LANGUAGE SQL
    CONTAINS SQL
    DETERMINISTIC
    RETURNS NULL ON NULL INPUT
    SQL SECURITY DEFINER
    COLLATION INVOKER
    INLINE TYPE 1
    RETURN 
    CAST(DATE '1970-01-01' + (UnixTime / 86400) AS TIMESTAMP(0))
    + ((UnixTime MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND)
    ;
    
    SELECT
       Epoch2Timestamp(-2147483648)
      ,Epoch2Timestamp(0)
      ,Epoch2Timestamp(2147483647)
    ;
    

    但是您的值似乎包括毫秒,这需要修改计算:

    CAST(DATE '1970-01-01' + (UnixTime / 86400000) AS TIMESTAMP(3))
    + ((UnixTime / 1000.000 MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND)
    

    编辑 2016-07-01:

    夏令时存在问题(请参阅 DevEx 上 Teradata 上的 this thread),这应该可以解决它:

    -- Unix time to Timestamp WITH TIME ZONE (+00:00)
    REPLACE FUNCTION UnixTime_to_TimeStamp_TZ (UnixTime INT)
    RETURNS TIMESTAMP(0) WITH TIME ZONE
    LANGUAGE SQL
    CONTAINS SQL
    DETERMINISTIC
    SQL SECURITY DEFINER
    COLLATION INVOKER
    INLINE TYPE 1
    RETURN
      ((CAST(DATE '1970-01-01' + (UnixTime / 86400) AS TIMESTAMP(0) AT 0)) AT 0)
    + ((UnixTime MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND);
    
    -- Unixtime to Timestamp, implicit TIME ZONE of the local session
    REPLACE FUNCTION UnixTime_to_TimeStamp (UnixTime INT)
    RETURNS TIMESTAMP(0)
    LANGUAGE SQL
    CONTAINS SQL
    DETERMINISTIC
    SQL SECURITY DEFINER
    COLLATION INVOKER
    INLINE TYPE 1
    RETURN
      CAST(((CAST(DATE '1970-01-01' + (UnixTime / 86400) AS TIMESTAMP(0) AT 0)) AT 0)
         + ((UnixTime MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND) AS TIMESTAMP(0));
    

    【讨论】:

      【解决方案2】:

      我能够使用以下查询将纪元列转换为时间戳。

      SELECT CAST((date '1970-01-01' + CAST(epochtimecolumn/1000 AS INTEGER)/86400) AS TIMESTAMP(6)) + (CAST(epochtimecolumn/1000 AS INTEGER) MOD 86400) * INTERVAL '00:00:01' HOUR TO SECOND + (epcho_time_column_with_milliseconds MOD 1000) * INTERVAL '00:00:00.001' HOUR TO SECOND from table_name

      只需将 epochtimecolumn 替换为上述查询中的列即可在 teradata 中运行它。

      希望对你有帮助!

      【讨论】:

        【解决方案3】:

        这是将 EPOCH 转换为 TERADATA LOCAL 的最简单方法。

        SELECT
           dhTimestamp as unix_epoc_time   , 
        
           to_timestamp(unix_epoc_time) utc,   
        
           cast(cast(utc as char(19))||'+00:00' as timestamp(0) with time zone) AT LOCAL
        
        1. 如果您的 epoch 超过 10 位,则将第 10 位之后的数字切掉,就可以正常工作了。
        2. 记住,Unix 时间是 UTC。
        3. 您的系统会将这个utc 视为本地。因此,让我们通过添加'+00:00' 使其了解它是UTC,然后使用AT LOCAL 或使用“America Central”、“America Eastern”、“America Mountain”等任何一个将其转换为您的本地。

        【讨论】:

          猜你喜欢
          • 2012-08-16
          • 2021-03-30
          • 2013-01-13
          • 2013-03-17
          • 2017-07-02
          • 2012-11-12
          • 2017-05-23
          • 2020-09-29
          相关资源
          最近更新 更多