【问题标题】:Why is Oracle returning a Not Valid Month error为什么 Oracle 返回 Not Valid Month 错误
【发布时间】:2019-12-13 01:49:55
【问题描述】:

谁能告诉我为什么这个 SQL 查询返回一个

ORA-01843. 00000 -  "not a valid month"

我现在错了,但应该是因为 2018 年不是一个有效的日子。 09 是有效月份。我觉得..

select to_timestamp('2018-09-05 11:35:41', 'dd/MM/yyyy HH:mi:ss') from dual;

我知道查询是错误的。我只是想知道为什么它没有说not a valid day 或类似的东西。错误现在说月份是错误的,这是错误的。

【问题讨论】:

  • 嗯,2018 年不是一个月中的有效日期。这似乎很明显。格式需要与您的字符串匹配。错误是关于月份而不是日期,这似乎很奇怪。
  • 您的输入字符串是yyyy-mm-dd,但您的格式字符串是dd/mm/yyyy - 显然那些不匹配
  • 是的,我同意。但错误说:不是一个有效的月份。这意味着月份是假的而不是日期部分
  • 我知道我的查询是错误的,但为什么错误是 NOT A VALID MONTH。我的月份部分是正确的(09)这是错误的日期部分
  • 我知道查询错误。我只是想知道为什么它没有说not a valid day 或类似的东西。错误现在说月份是错误的,这是错误的。感谢您的帮助

标签: sql oracle timestamp


【解决方案1】:

如果您“坚持”收到与日期相关的错误消息,请尝试使用 FX 修饰符:

SELECT TO_TIMESTAMP('2018-09-05 11:35:41', 'FXdd/MM/yyyy HH:mi:ss') FROM dual;

Error at line 1
ORA-01861: literal does not match format string

我认为这是您所期望的错误消息。

或尝试“有效”月份,例如

SELECT TO_TIMESTAMP('2008-09-05 11:35:41', 'dd/MM/yyyy HH:mi:ss') FROM dual;

Error at line 1
ORA-01830: date format picture ends before converting entire input string

【讨论】:

    【解决方案2】:

    原因是甲骨文试图变得聪明/乐于助人。所以,它是在解释:

    select to_timestamp('2018-09-05 11:35:41', 'dd/MM/yyyy HH:mi:ss') from dual;
    ---------------------^ddMM
    

    20 被解释为有效日期。然后是一个月。 Oracle 试图忽略分隔符很有帮助。因此,18 是无效月份。

    试试这个:

    select to_timestamp('2012-2012', 'dd/MM/yyyy') from dual
    

    【讨论】:

    • 这正是我想了解的。不知道Oracle是这样解释的。非常感谢!
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多