首页 > 解决方案 > 将带有时区的时间戳转换为时间戳

问题描述

试图将一些数据插入到一个表中。但是,我尝试收到数据兼容性问题。我尝试插入的列是 timestamp(6) 列,而我从中提取数据的列是带有时区列的时间戳。我知道如何使用强制转换从时间戳转换为带有时区的时间戳,但不是相反的。有没有办法可以去掉“UTC”?

我开始的日期:

'20-MAY-18 09.00.00.000000000 AM UTC'

我想结束的日期:

'20-MAY-18 09.00.00.000000000 AM'

到目前为止我所尝试的:

select to_date('20-MAY-18 09.00.00.000000000 AM UTC', 'dd-mon-yy hh:mi:ss A.M.') from dual;

但是我收到一个错误,我似乎无法弄清楚,我做错了什么?提前致谢!

标签: sqloracle

解决方案


您可以将带有时区的时间戳转换为普通时间戳:

cast(<your_value> as timestamp)

所以你的价值:

select cast(
  to_timestamp_tz('20-MAY-18 09.00.00.000000000 AM UTC', 'DD-MON-RR HH:MI:SS.FF AM TZR')
  as timestamp)
from dual;

CAST(TO_TIMESTAMP_T
-------------------
2018-05-20 09:00:00

如果您将带有 tome zone 值的时间戳作为时间戳插入到普通时间戳列中,那么它将自动转换,只是丢失其绑定区域信息。

如果这些值可能并不总是 UTC,那么您可以一次性将它们转换为 UTC 和普通时间戳sys_extract_tc()

with cte (tsz) as (
            select timestamp '2018-05-20 09:00:00.0 UTC' from dual
  union all select timestamp '2018-05-20 13:00:00.0 America/New_York' from dual
)
select tsz, cast(tsz as timestamp) as ts, sys_extract_utc(tsz) utc
from cte;

TSZ                            TS                  UTC                
------------------------------ ------------------- -------------------
2018-05-20 09:00:00.000 +00:00 2018-05-20 09:00:00 2018-05-20 09:00:00
2018-05-20 13:00:00.000 -04:00 2018-05-20 13:00:00 2018-05-20 17:00:00

推荐阅读