Как перевести время эпохи в человеко-читабельное в Teradata

В моей таблице Teradata у меня есть метки времени эпохи под колонкой dhTimestamp

dhTimestamp  
1435308067705  
1434965874565  
1434763800794  
1434775876034  
1434765207057  

Как я могу преобразовать метку времени эпохи в формат даты / времени человека на Teradata?

1 ответ

Решение

Это SQL UDF для стандартного unixtime:

/**********
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:

Возникла проблема с переходом на летнее время (см. Эту ветку на Teradata на DevEx), это следует исправить:

-- 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));

Это наиболее простой способ конвертировать 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. Если у вас есть эпоха с более чем 10 цифрами, тогда нарежьте числа после 10-й цифры, это будет нормально работать.
  2. помните, время Unix находится в формате UTC.
  3. ваша система будет лечить это utcкак местные. Итак, давайте дадим понять, что это UTC, добавив'+00:00' а затем преобразовать его в ЛОКАЛЬНЫЙ, используя AT LOCAL ИЛИ используя любой из этих вариантов "Центральная Америка", "Восточная Америка", "Гора Америки" и т. Д.

Мне удалось преобразовать столбец эпохи в метку времени, используя запрос ниже.

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.

Надеюсь, поможет!!

Другие вопросы по тегам