将带有时区的时间戳转换为只是时间戳

时间:2018-07-10 15:55:47

标签: sql oracle

尝试将一些数据插入表中。但是,我尝试接收数据兼容性问题。我要插入的列是timestamp(6)列,而我从中提取数据的列是带有timezone列的时间戳。我知道如何使用强制转换将时间戳从时间戳转换为带时区的时间戳,而不是逆。有什么办法可以去除“ 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;

但是我收到一个错误,但似乎无法弄清楚,我在做什么错?预先感谢!

1 个答案:

答案 0 :(得分:3)

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

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值的时间戳插入到普通的timestamp列中,则它将自动转换,只是会丢失其联系区域信息。

如果值不一定总是UTC,则可以使用sys_extract_tc()一次性将它们转换为UTC和普通时间戳:

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