Как конвертировать 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;