【问题标题】:"AM/A.M. or PM/P.M. required" error though AM is used尽管使用了 AM,但“需要 AM/A.M. 或 PM/P.M.”错误
【发布时间】:2017-10-13 19:55:29
【问题描述】:

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

当我使用 SQL Developer 从此 column_name1 中选择任何内容时,我看到的日期类似于:19-SEP-17 03.19.55.000000000 PM +00:00,它采用 UTC。

如果我在我的 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');

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

我也尝试添加“nls_date_language=american”,但仍然出现同样的错误。

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

【问题讨论】:

    标签: oracle oracle12c timestamp-with-timezone to-timestamp


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复,很抱歉很晚才检查。我最终更改了 Oracle SQL Developer 中的默认时间戳显示格式,并将其更改为 YYYY-MM-DD HH24.MI.SSXFF 和带有时区的时间戳 YYYY-MM-DD HH24.MI.SSXFF TZR。我是从工具 -> 首选项 -> 数据库 -> NLS 完成的
    • @300 - 大多数开发人员更喜欢 24 小时格式(更少的混乱,更少出现像这样烦人的规则的机会)。 AM/PM 将用于非技术“消费者”报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2022-01-19
    • 2011-10-14
    • 2012-01-24
    相关资源
    最近更新 更多