在Spring JdbcTemplate中使用Date时出现ORA-01843错误

时间:2014-11-25 16:38:25

标签: spring oracle

在查看大多数可能的解决方案之后,我仍然遇到这个例外:

ORA-01843: not a valid month

我的查询和查询调用看起来像这样

String sql = "select * from my_view "
           + "where TO_DATE(?, 'MM/DD/YYYY', 'NLS_DATE_LANGUAGE = American') "
                  + "between enroll_date and suspend_date "
           + "order by last_name, first_name";

return new JdbcTemplate(dataSource)
        .query(sql, 
               new Object[] { new java.sql.Date(dateOfCall.getTime()) }, 
               new BeanPropertyRowMapper<MyDto>(MyDto.class)
              );

dateOfCall的类型为

java.util.Date

1 个答案:

答案 0 :(得分:2)

您已将其绑定为日期。因此,Oracle使用TO_CHAR()隐式将其转换为字符串,格式为NLS_DATE_FORMAT

让我们假设NLS_DATE_FORMAT = 'DD/MM/YYYY'

说日期25th November 2014隐式转换为25/11/2014.

现在TO_DATE() MM/DD/YYYY可能错误了,因为月份与25映射在这里。

除非您在日期字符串中使用缩写月/日。只需日期即可。无需NLS_DATE_LANGUAGE设置。

String sql = "select * from my_view "
           + "where ? "
                  + "between enroll_date and suspend_date "
           + "order by last_name, first_name";