如何将纪元转换为日期时间红移?
How to convert epoch to datetime redshift?
我在 dbeaver 工作。我有一个 table x。
TABLE x 有一列 "timestamp"
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
但没用。
发生错误:
Invalid operation: function from_unixtime(character varying) does not exist
我也试过了
SELECT DATE_FORMAT(x.timestamp, '%d/%m/%Y') as x_date
FROM x
发生错误:
Invalid operation: function date_format(character varying, "unknown") does not exist
语法有问题吗?还是有另一种方法可以转换为人类可读的日期和时间?
提前致谢
Redshift 没有 from_unixtime()
功能。您需要使用以下 SQL 查询来获取时间戳。它只是将秒数添加到纪元和 return 作为时间戳。
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;
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;
为了快速参考,这里是 Python 中 from_unixtime
函数的 SQL UDF 实现。我没有测试性能,但我想它会类似于普通的 SQL 版本。不过写起来容易多了。
注意:这计算了从纪元开始的秒的数量。
CREATE FUNCTION from_unixtime (BIGINT)
RETURNS TIMESTAMP WITHOUT TIME ZONE
IMMUTABLE
as $$
SELECT TIMESTAMP 'epoch' + / 1000 * interval '1 second'
$$ LANGUAGE sql;
我是这样用的
CAST(DATEADD(S, CONVERT(int,LEFT(column_name, 10)), '1970-01-01')as timestamp) as column_name
SELECT
,task_id
,CAST(DATEADD(S, CONVERT(int,LEFT(SLA, 10)), '1970-01-01')as timestamp) as SLA
FROM my_schema.my_task_table ;
我在 dbeaver 工作。我有一个 table x。
TABLE x 有一列 "timestamp"
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
但没用。
发生错误:
Invalid operation: function from_unixtime(character varying) does not exist
我也试过了
SELECT DATE_FORMAT(x.timestamp, '%d/%m/%Y') as x_date
FROM x
发生错误:
Invalid operation: function date_format(character varying, "unknown") does not exist
语法有问题吗?还是有另一种方法可以转换为人类可读的日期和时间?
提前致谢
Redshift 没有 from_unixtime()
功能。您需要使用以下 SQL 查询来获取时间戳。它只是将秒数添加到纪元和 return 作为时间戳。
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;
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;
为了快速参考,这里是 Python 中 from_unixtime
函数的 SQL UDF 实现。我没有测试性能,但我想它会类似于普通的 SQL 版本。不过写起来容易多了。
注意:这计算了从纪元开始的秒的数量。
CREATE FUNCTION from_unixtime (BIGINT)
RETURNS TIMESTAMP WITHOUT TIME ZONE
IMMUTABLE
as $$
SELECT TIMESTAMP 'epoch' + / 1000 * interval '1 second'
$$ LANGUAGE sql;
我是这样用的
CAST(DATEADD(S, CONVERT(int,LEFT(column_name, 10)), '1970-01-01')as timestamp) as column_name
SELECT
,task_id
,CAST(DATEADD(S, CONVERT(int,LEFT(SLA, 10)), '1970-01-01')as timestamp) as SLA
FROM my_schema.my_task_table ;