将带有时区的Varchar转换为Oracle中的时间戳

时间:2020-07-15 05:03:58

标签: sql oracle datetime timestamp timestamp-with-timezone

我在将varchar转换为DateTime / timestamp时遇到问题。 就是这种情况

ID    EVENT_TIME(Varchar)
1    2020-04-12T09:25:53+0800
2    2020-04-12T09:25:53+0700
3    2020-04-12T09:25:53+0900

我想返回的所有时间戳都转换为+0700

ID    EVENT_TIME(Datetime)
1    2020-04-12 10:25:53 
2    2020-04-12 09:25:53
3    2020-04-12 11:25:53

这可能吗?以及如何使用oracle来做到这一点?

谢谢

2 个答案:

答案 0 :(得分:2)

请在下面的查询中使用to_timestamp_tz将varchar转换为时间戳,并再次使用to_char将其转换为所需的时间格式

select ID, to_char(to_timestamp_tz(EVENT_TIME, 'YYYY-MM-DD"T"HH24:MI:SS.FF TZH:TZM'), 'YYYY-MM-DD HH24:MI:SS') as event_date from table_name;

示例:

select to_char(to_timestamp_tz('2020-04-12T09:25:53+0800', 'YYYY-MM-DD"T"HH24:MI:SS.FF TZH:TZM'), 'YYYY-MM-DD HH24:MI:SS') as event_date from dual;

enter image description here

答案 1 :(得分:0)

正如@Jim所说,您可以将to_timestamp_tz()与字符文字一起使用,以将字符串转换为时间戳值:

to_timestamp_tz(event_time, 'SYYYY-MM-DD"T"HH24:MI:SSTZH:TZM')

要归一化为+07:00偏移量,可以使用at time zone

to_timestamp_tz(event_time, 'SYYYY-MM-DD"T"HH24:MI:SSTZH:TZM') at time zone '+07:00'

如果您不想保留时区部分,可以将其转换为普通时间戳:

cast(
  to_timestamp_tz(event_time, 'SYYYY-MM-DD"T"HH24:MI:SSTZH:TZM') at time zone '+07:00'
  as timestamp)

或者您可以cast (... as date),因为您没有小数秒。

或者您可以将其转换回显示的字符串:

to_char(
  to_timestamp_tz(event_time, 'SYYYY-MM-DD"T"HH24:MI:SSTZH:TZM') at time zone '+07:00',
  'SYYYY-MM-DD HH24:MI:SS')

db<>fiddle