我正在使用以下查询获取一些数据
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'
。