我正在使用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中的句子,这完全运行,我有两个数据库,一个用于测试,一个用于生产,生产标记了这个错误,并且在测试中没有。
我也想知道,什么更好?将日期包含在字符串中,然后将其传递给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());
或将日期值作为参数传递?
这可能是错误的原因?
非常感谢。
答案 0 :(得分:1)
隐式日期转换可能取决于您的客户端和服务器设置。相同的代码通常在一个环境中运行,而不是在另一个环境中运行。
一种解决方案是使用ISO 8601格式的ANSI日期文字:
trunc(fh_report) = date '2015-09-01'
我猜测原始代码使用美国日期格式。 ISO 8601的优点是没有人或计算机需要猜测,这是明确的。
答案 1 :(得分:0)
trunc (fh_report) = '09 / 01/2015 '
如果您要去TRUNC()日期,结果值应为documentation中指定的“DD-MON-YYYY”。
我想如果你把你的=文本改为
trunc (fh_report) = '01-SEP-15'
它应该有用。
但是,我很困惑,你说它在IDE中有效。除非你有不同的数据库或版本,否则我无法想象它是否有效。