如何在配置单元中转换来自不同时区的时间戳

qyzbxkaa  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(473)

我正在用json有效负载查询配置单元中的一个表,并从这些有效负载中提取时间戳。问题是时间戳以不同的时区格式存在,我正试图在我的时区中提取它们。
我目前正在使用以下工具:
选择
from_unixtime(unix_timestamp(get_json_object(table.payload,$.timestamp'),“yyyy-mm-dd't'hh:mm:ss.sss”))
从表
如果时间戳的格式为:2018-08-16t08:54:05.543z-->2018-08-16 18:54:05(已更改格式并转换为我的时区),则返回正确的值
但是,如果有效负载包含以下格式的时间戳:2018-09-13t01:35:08.460+0000 2018-09-13t11:35:09+10:00,则上面的查询返回“null”
如何调整我的查询,使其适用于所有类型的时间戳所有转换到正确的时区(+10是我的时区!)都是同样的格式?
提前谢谢!

ncgqoxb0

ncgqoxb01#

如果没有regexp,则使用z表示+1000,使用表示+10:00:

select unix_timestamp('2016-07-30T10:29:33.000+03:00', "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") as t1
select unix_timestamp('2016-07-30T10:29:33.000+0300', "yyyy-MM-dd'T'HH:mm:ss.SSSZ") as t2

关于时间格式的完整文档:https://docs.oracle.com/javase/7/docs/api/java/text/simpledateformat.html

tv6aics1

tv6aics12#

下面的宏如何:

create temporary macro extract_ts(ts string) 
  from_unixtime(unix_timestamp(regexp_extract(ts, '(.*)\\+(.*)', 1), "yyyy-MM-dd'T'HH:mm:ss") + 3600*cast(regexp_extract(ts, '(.*)\\+(.*)\\:(.*)', 2) as int));

例如。,

hive> select extract_ts('2018-09-13T11:35:09+10:00');
OK
2018-09-13 21:35:09

相关问题