ORA-01843: 不是有效的月份 JPA
Posted
技术标签:
【中文标题】ORA-01843: 不是有效的月份 JPA【英文标题】:ORA-01843: not a valid month JPA 【发布时间】:2015-01-13 00:58:16 【问题描述】:我正在使用 JPA 1 并且有一个本机查询执行以下语句:
select NVL (max (x.some), 0) from (select count (1) as some, service from some_table Where trunc (fh_report) = '09 / 01/2015 'group by service) x
标记错误是:
java.sql.SQLDataException: ORA-01843: 月份无效
但是,如果我在 ORACLE ide 中复制这句话,它运行得很好,我有两个数据库,一个用于测试,一个用于生产,生产标记这个错误,而在测试中不要。
我也想知道,什么比较好??将日期包含在字符串中,然后像这样将其传递给 jpa?
String sql = "select NVL (max (x.some), 0) from (select count (1) as some, service from some_table Where trunc (fh_report) = '09 / 01/2015 'group by service) x ";
Query query = em.createNativeQuery(sql.toString());
还是将日期值作为参数传递?
这可能是错误的原因?
非常感谢。
【问题讨论】:
发布实际执行的 SQL 语句,还是按原样执行?日期格式看起来很奇怪。 嗨 Chylis 是的,它的执行就像我发布的那样,如果我在 sql developer 或任何其他 sql ide 中运行它,它会完美运行... 【参考方案1】:隐式日期转换可能取决于您的客户端和服务器设置。相同的代码通常会在一种环境中运行,但不会在另一种环境中运行。
一种解决方案是使用 ISO 8601 格式的 ANSI 日期文字:
trunc(fh_report) = date '2015-09-01'
我猜原始代码使用的是美国日期格式。 ISO 8601 的优点是不需要人或计算机去猜测,它是明确的。
【讨论】:
你好 Jon 感谢 4 个回答,奇怪的是,如果问题是数据库中 NLS_DATE_FORMAT 的配置,查询将无法在 sql navigator 或任何其他 ide sql 中工作,我使用 weblogic 作为应用程序服务器,如果我将我的数据源设置为指向我的数据库生产数据,则会犯此错误,但是,如果指向我的测试数据库错误 no-show,则 NLS_DATE_FORMAT 为两个基础配置如下:NLS_DATE_FORMAT DD / MM / RR。有什么想法吗?顺便说一句,我如何按照我的建议把它放在文字中? 设置 NLS_DATE_FORMAT 的方法有很多,因此您要避免依赖它。它可以使用服务器默认值,也可以由驱动程序、IDE、IDE 调用的自定义脚本、登录触发器、在会话中执行的对象等设置。我理解将问题归咎于环境差异的冲动,但是这确实是一个代码问题。这是所有代码都应该期望的环境差异。要使用文字,只需将'09 / 01/2015 '
替换为 date '2015-09-01'
。【参考方案2】:
trunc (fh_report) = '09 / 01/2015 '
如果您要 TRUNC() 日期,则结果值应为 documentation 中指定的“DD-MON-YYYY”。
我想如果您将 = 文本更改为
trunc (fh_report) = '01-SEP-15'
它应该工作。
但是,我很困惑你说它在你的 IDE 中工作。除非您有不同的数据库或版本,否则我无法想象它会起作用。
【讨论】:
该文档只是可能的日期格式的一个示例。实际日期格式将取决于客户端和服务器设置。 这是我在使用过的 Oracle DB 时经常看到的格式。也许这是默认值。 @JonHeller,有没有办法设置或查看该设置?以上是关于ORA-01843: 不是有效的月份 JPA的主要内容,如果未能解决你的问题,请参考以下文章