2016-10-02 45 views
9

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

我試圖紅移查詢

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

紅移不必須的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時間,因爲這只是時間戳字段。您可以嘗試使用時區而不是時間戳來選擇時間戳。 – 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; 

的細節

+0

這太棒了。 – flybonzai

5

UDF將是相當緩慢見Redshift documentation on 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

第二好的 -

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; 
相關問題