我正在使用以下查询获取一些数据

SELECT
t.value_date,t.settlement_date,
  (CASE WHEN NVL( t.settlement_date, '01-01-9999')='01-01-9999'
    THEN t.value_date
    ELSE t.settlement_date
  END) AS modified_value_date,
  t.instrument_pk,
  bct.base_ccy_pk,
  i.contract_size,
  lc.min_trading_unit AS min_trading_unit_lc,
  bc.min_trading_unit AS min_trading_unit_bc

FROM transaction t,
  bc_transaction bct,
  instrument i,
  instrument lc,
  instrument bc

WHERE t.status         = 'NORMAL'
AND t.fund_pk          = 99436
AND t.instrument_pk    = 235342
AND t.instrument_pk    = i.instrument_pk
AND t.local_ccy_pk     = lc.instrument_pk
AND bct.transaction_pk = t.transaction_pk
AND bct.base_ccy_pk    = bc.instrument_pk
AND t.value_date      >= to_date('20121123000000','yyyymmddhh24miss')
AND t.transaction_type = 'SECURITY_TRADE'
ORDER BY modified_value_date,
  t.processing_order,
  t.txn_reference_no;


问题是,当我在Oracle SQL Developer中运行上述查询时,它会给出正确的结果。但是,当我尝试使用PreparedStatement从我的Java程序运行查询时,它会生成类似java.sql.SQLException的异常:ORA-01843:无效的月份

当我用CASE bolck替换日期时,我的问题解决了

(CASE WHEN NVL(t.settlement_date,to_date('99990101000000','yyyymmddhh24miss'))=to_date('99990101000000','yyyymmddhh24miss')
    THEN t.value_date
    ELSE t.settlement_date
  END) AS modified_value_date


现在我的问题是


为什么存在这种差异?如果问题与to_date()有关,那么它应该在SQL中给出相同的异常
开发商也。
问题并没有到此结束,我再次从eclipse调试程序时看到了同样的查询运行良好的情况
在NVL块中没有to_date()的情况下,我检查了一下,发现我的JDK
是1.5,但JRE是1.6。然后我将JRE更改为1.5并进行调试
相同的Java程序,发现它正在产生相同的
例外,对于在NVL块中没有to_date()的同一查询,在
调试时间。

现在我完全弄明白了为什么之间存在这种差异
JRE 5和JRE 6?


谁能帮我?

最佳答案

它与JRE版本无关,而与会话设置有关。您已指定字符串,并使用NLS设置(可能是NLS_DATE_FORMAT)将Oracle会话保留为隐式转换为日期。帮自己一个忙-切勿让硬编码值依赖于外部设置。
您可以改用DATE'9999-01-01'

09-10 07:17
查看更多