Как конвертировать epoch в datetime redshift?

Я работаю в dbeaver. У меня есть таблица X.

таблица x имеет столбец "отметка времени"

1464800406459 
1464800400452 
1464800414056 
1464800422854 
1464800411797

результат, который я хочу:

Wed, 01 Jun 2016 17:00:06.459 GMT
Wed, 01 Jun 2016 17:00:00.452 GMT
Wed, 01 Jun 2016 17:00:14.056 GMT
Wed, 01 Jun 2016 17:00:22.854 GMT 
Wed, 01 Jun 2016 17:00:11.797 GMT 

я попробовал запрос redshift

SELECT FROM_UNIXTIME(x.timestamp) as x_date_time 
FROM x

но не сработало.

ошибка:

недопустимая операция: функция from_unixtime (изменение символов) не существует

Я тоже пробовал

SELECT DATE_FORMAT(x.timestamp, '%d/%m/%Y') as x_date 
FROM x

ошибка:

недопустимая операция: функция date_format (символ меняется, "неизвестно") не существует

есть ли какие-либо ошибки в синтаксисе? Или есть другой способ конвертировать в читаемую человеком дату и время?

спасибо заранее

3 ответов


Redshift не имеет функции from_unixtime (). Вам нужно будет использовать следующий sql-запрос, чтобы получить метку времени. Он просто добавляет нет секунд к эпохе и возвращается как отметка времени.

select timestamp 'epoch' + your_timestamp_column * interval '1 second' AS your_column_alias
from your_table

самое простое решение-создать from_unixtime() функция:

CREATE OR REPLACE FUNCTION from_unixtime(epoch BIGINT)
  RETURNS TIMESTAMP  AS
'import datetime

return datetime.datetime.fromtimestamp(epoch)
'
LANGUAGE plpythonu IMMUTABLE;

посмотреть Redshift документация на UDF дополнительные сведения


UDF будет довольно медленным. Проверено время выполнения для 3 решений и 1K строк.

самый медленный -

-- using UDF from one of the answers
SELECT from_unixtime(column_with_time_in_ms/ 1000)
FROM table_name LIMIT 1000;

срок исполнения: 00:00:02.348062s

2-й лучший -

SELECT date_add('ms',column_with_time_in_ms,'1970-01-01')
FROM table_name LIMIT 1000;

срок исполнения: 00:00:01.112831s

а самый быстрый -

SELECT TIMESTAMP 'epoch' + column_with_time_in_ms/1000 *INTERVAL '1 second'
FROM table_name LIMIT 1000;

срок исполнения: 00:00:00.095102s


время выполнения рассчитывается из stl_query -

SELECT *
       ,endtime - starttime
FROM stl_query
WHERE querytxt ilike('%table_name%limit%')
ORDER BY starttime DESC;