【发布时间】:2020-12-01 05:05:33
【问题描述】:
我在表 A 中有一个列
select create_time from table_a;
值为
08-MAR-19 08.23.47.897000000 PM GMT.
出于某些业务目的,此列已标记为 VARCHAR2。现在我正在尝试获取此列并将值转换为 TIMESTAMP 出于某种目的,如下所示:
SELECT TO_TIMESTAMP(create_time, 'DD-MON-YYYY HH.MI.SS.FF AM') from table_a;
但我收到错误:
ORA-01830: date format picture ends before converting entire input string
有人可以帮我将此 varchar 数据转换为时间戳。我想做的原因是,我需要将这个时间从一个时区转换为另一个时区: 例如:
SELECT FROM_TZ(TO_TIMESTAMP(create_time, 'DD-MON-YYYY HH.MI.SS.FF AM'), 'UTC') AT TIME ZONE 'CET' from table_a;
【问题讨论】:
-
字符串末尾的
GMT是问题所在。你需要substring你的输入来摆脱它。 -
为什么将
create_time存储为字符串而不是正确的时间戳?什么业务目的需要错误的数据类型以及可能导致的数据完整性和性能问题?并且这些值总是格林威治标准时间吗? (您确定它 is 实际上是一个字符串,而这不仅仅是您的客户端通过 NLS 设置显示时间戳的方式吗?) -
嗨@AlexPoole,是的,我知道这个列实际上是一个varchar 字段。原因是客户不想在数据错误的情况下丢失任何信息。没有性能问题,因为该表有一个存档表,并且每次运行的数据少于 100 条记录。时间值在不同的时区接收(产品不允许将数据库时区更改为客户端时区..)因此问题:)
标签: oracle oracle12c sql-timestamp