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