如何将epoch转换为datetime redshift?

Khu*_*dia 26 datetime epoch amazon-redshift

我在dbeaver工作.我有一张桌子x.

表x有一列"timestamp"

1464800406459 
1464800400452 
1464800414056 
1464800422854 
1464800411797
Run Code Online (Sandbox Code Playgroud)

我想要的结果:

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 
Run Code Online (Sandbox Code Playgroud)

我试过redshift查询

SELECT FROM_UNIXTIME(x.timestamp) as x_date_time 
FROM x
Run Code Online (Sandbox Code Playgroud)

但没有奏效.

发生了错误:

无效操作:函数from_unixtime(字符变化)不存在

我也试过了

SELECT DATE_FORMAT(x.timestamp, '%d/%m/%Y') as x_date 
FROM x
Run Code Online (Sandbox Code Playgroud)

发生了错误:

操作无效:函数date_format(字符变化,"未知")不存在

语法有什么问题吗?或者有另一种方式转换为人类可读的日期和时间?

提前致谢

use*_*814 52

Redshift没有from_unixtime()函数.您需要使用以下sql查询来获取时间戳.它只是将纪元添加到纪元,并作为时间戳返回.

select timestamp 'epoch' + your_timestamp_column * interval '1 second' AS your_column_alias
from your_table
Run Code Online (Sandbox Code Playgroud)

  • 我只是意识到your_timestamp_column是字符串,它有13位数.所以我添加了你的语法:`select timestamp'epoch'+ CAST(your_timestamp_column AS BIGINT)/ 1000*interval'1秒'来自your_table`的AS your_column_alias.谢谢. (4认同)
  • @ZephDavies 将您的 Unix 时间戳列视为浮点:`select timestamp 'epoch' + your_timestamp_column::float * 间隔 '1 秒' ...` (2认同)

Gau*_*rav 15

UDF将会非常缓慢.检查3个解决方案和1k行的执行时间.

最慢的 -

-- using UDF from one of the answers
SELECT from_unixtime(column_with_time_in_ms/ 1000)
FROM table_name LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

执行时间:00:00:02.348062s

第二好 -

SELECT date_add('ms',column_with_time_in_ms,'1970-01-01')
FROM table_name LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

执行时间:00:00:01.112831s

而且速度最快 -

SELECT TIMESTAMP 'epoch' + column_with_time_in_ms/1000 *INTERVAL '1 second'
FROM table_name LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

执行时间:00:00:00.095102s


执行时间由stl_query- 计算

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


小智 13

最简单的解决方案是创建from_unixtime()功能:

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

return datetime.datetime.fromtimestamp(epoch)
'
LANGUAGE plpythonu IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅UDF上的Redshift文档