2016-10-02 3 views
9

Я работаю в dbeaver. У меня есть таблица x.Как преобразовать эпоху в datetime redshift?

СТОЛ х имеет столбец "метку"

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 

Я попробовал красное смещение запрос

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 

Ошибка:

Inval id: функция date_format (символ меняется, «неизвестно») не существует

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

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

ответ

17

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

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

Я просто понимаю, что your_timestamp_column является строка, и она имеет 13 цифра. Поэтому я добавил ваш синтаксис как: 'select timestamp 'epoch' + CAST (your_timestamp_column AS BIGINT)/1000 * interval '1 second' AS your_column_alias from your_table'. Спасибо. –

+0

как добавить часовой пояс? потому что за временем нет GMT. –

+0

Я не уверен, можем ли мы получить время GMT GMT, поскольку это только поле метки времени. вы можете попробовать выбрать временную метку с часовым поясом вместо метки времени. – Veeram

10

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

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

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

См Redshift documentation on UDF подробности

+0

Это фантастика. – flybonzai

5

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

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

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

второй лучший -

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


Execution рассчитывается из stl_query -

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