oracle 错误:不是一个有效的月份

Posted

技术标签:

【中文标题】oracle 错误:不是一个有效的月份【英文标题】:oracle error: not a valid month 【发布时间】:2016-11-30 03:30:10 【问题描述】:

我正在 websphere 7.0 版本上运行一个应用程序,该应用程序是在我的 QA 环境中新设置的并且低于 oracle 错误

SELECT MODIFIED_DATE 
FROM /*Query Builder Clause*/ abc 
WHERE  abc_CID = '1189' 
   AND NVL(to_date('2010-3-17 11.30.10.0', 'MM-dd-yyyy hh24:mi:ss'), SYSDATE)=decode(MODIFIED_DATE,null,SYSDATE,MODIFIED_DATE)

抛出异常

错误报告:

SQL 错误:ORA-01843:不是有效月份 01843. 00000 - “不是一个有效的月份”

此异常仅在 websphere 中弹出。此外,我无法修改代码,因为相同的代码正在现场的 websphere 上运行。我也尝试进行 websphere user.timezone 设置,我也尝试将默认 ojdbc6.jar 设置为更高版本。同样的代码在 jboss 和 weblogic 中也可以正常工作。请帮我解决这个问题。

【问题讨论】:

NVL(to_date('03-17-2010 11:30:10', 'MM-dd-yyyy hh24:mi:ss'),SYSDATE) 这是服务器生成的带有时间戳的日期格式 在下面查看我的答案(以获得更好的格式) 格式模型(TO_DATE 函数的第二个参数)需要匹配第一个参数的实际格式。 ('2010-...'的值与格式模型'MM-...'不匹配) 【参考方案1】:

Oracle 不以毫秒存储日期类型,这意味着您必须修剪最后一个标记。在这种情况下,你的表达是:

NVL(to_date('2010-3-17 11.30.00', 'yyyy-mm-dd hh24.mi.ss'),SYSDATE)

您也可以转换为时间戳:

NVL(to_timestamp('2010-3-17 11.30.00.0', 'yyyy-mm-dd hh24.mi.ss.ff1'),SYSDATE)

【讨论】:

我无法更改代码,因为相同的代码在 websphere 生产环境和其他服务器上表现良好。我们遵循以下 NVL(to_date('11-30-17 11.30.10.0', 'MM-dd-yyyy hh24:mi:ss') 格式。这是 websphere 设置问题。 应该更好NVL(to_timestamp('2010-3-17 11.30.00.0', 'yyyy-mm-dd hh24.mi.ss.ff1'),SYSTIMESTAMP)【参考方案2】:

问题是'2010-3-17 11.30.10.0''MM-dd-yyyy hh24:mi:ss' 不匹配。我假设正在运行的其他服务器位于使用MM-dd-yyyy 格式的不同语言环境中。如果您无法进行任何代码更改以重新格式化日期,您将需要更改您的 jvm 语言环境以匹配它的工作位置(或任何使用MM-dd-yyyy 的语言环境)。请参阅以下链接以更改 jvm 语言环境:

how do I set the default locale for my JVM?

【讨论】:

以上是关于oracle 错误:不是一个有效的月份的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01843 - 不是有效的月份 oracle SQL

“ORA-01843: 不是一个有效的月份”错误

ORA-01843 不是有效月份 - 比较日期

SQL 错误:ORA-01843:不是有效月份

ORACLE 01843. 00000 - “不是一个有效的月份”

从存储过程刷新物化视图时出错(不是有效月份)