0

我在 oracle 12c 上有 table_name,其中 column_name1 的数据类型为“TIMESTAMP(6) WITH TIME ZONE”。我正在使用 SQL 开发人员。

当我使用 SQL Developer 从此 column_name1 中选择任何内容时,我看到的日期如下:19-SEP-17 03.19.55.000000000 PM +00:00UTC 格式。

如果我在我的 SQL 中使用相同的格式并在 where 子句中将其作为字符串提供,则它可以正常工作。例子:

select column_name1 from table_name where column_name1 = '19-SEP-17 03.19.55.000000000 PM +00:00';

但我知道在这种情况下建议将字符串转换为日期。因此,当我尝试使用 TO_TIMESTAMP 执行此操作时,我找不到要添加到 SQL 中的正确格式。

我尝试过的是:

select column_name1 from table_name where column_name1 = TO_TIMESTAMP('19-SEP-17 03.19.55.000000000 PM +00:00', 'DD-MON-YYYY HH:MI:SS.FF A.M. TZH:TZM');

即使 AM/PM 已经存在,我仍然会收到错误消息: AM/A.M. or PM/P.M. required

我也尝试添加 'nls_date_language=american' 但仍然得到相同的错误。

我在这里想念什么?如何更改 TO_TIMESTAMP 格式以便将此字符串转换为 TIMESTAMP?

4

1 回答 1

3

实际上,您是否正在使用TO_TIMESTAMP_TZ- 因为该列是带时区的时间戳,并且输入字符串和格式模型都是带时区的时间戳?(如果你这样使用TO_TIMESTAMP,你会得到一个不同的错误,比如“日期格式无法识别” - 因为你不能在格式模型中包含没有时区的时间戳的时区格式元素)。

假设是这种情况:问题是由于PM在输入字符串中传递(不带点),但A.M.在格式模型中有(带点)。在这两个地方使用相同的格式 - 可以使用点,也可以不使用,但要保持一致。

在某些地方,Oracle 不会对不匹配的分隔符大惊小怪,但在这种情况下它确实如此。如果您愿意,您可以浏览文档以准确了解 Oracle 将尝试哪些替换;但这听起来像是一项学术活动。只需在输入字符串和格式模型之间保持一致,您就不会遇到任何问题。

于 2017-10-14T03:03:46.557 回答