【问题标题】:Converting a timestamp with Time zone to just a timestamp将带有时区的时间戳转换为时间戳
【发布时间】:2018-12-18 13:27:59
【问题描述】:

试图向表中插入一些数据。但是,我尝试收到数据兼容性问题。我要插入的列是 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;

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

【问题讨论】:

  • 如果你知道如何投射一种方式,为什么不知道另一种方式呢?无论如何,这将在插入时自动完成,所以我不确定您遇到了什么实际问题?
  • 我在投射时收到以下错误:“日期格式图片在转换整个输入字符串之前结束”。我正在尝试找到一种方法将带有时区的时间戳插入到时区列中。
  • 这个错误听起来你正在将该字符串转换为时间戳,而不是带有时区值的实际时间戳。
  • 你是对的,谢谢!

标签: sql oracle


【解决方案1】:

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

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 值的时间戳作为时间戳插入到普通时间戳列中,那么它将自动转换,只是丢失其 tie zone 信息。

如果这些值可能并不总是 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

【讨论】:

  • 非常感谢!使用这个数据模型绝对是一场噩梦......
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 2019-10-07
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2020-11-27
  • 1970-01-01
相关资源
最近更新 更多