0

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

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: not a valid month

当我将 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

现在我的问题是

  1. 为什么会有这种差异?如果问题出在 to_date() 那么它应该在 SQL 开发人员中也给出相同的异常。
  2. 问题并没有在这里结束我看到当我再次从 Eclipse 调试我的程序时,相同的查询在 NVL 块中没有 to_date() 的情况下完美运行我检查并发现我的 JDK 是 1.5 但 JRE 是 1.6。然后我改变了我的JRE 到 1.5 并调试相同的 java 程序,发现它在调试时产生相同的异常,对于 NVL 块中没有 to_date() 的相同查询。

    现在我完全搞砸了,为什么 JRE 5 和 JRE 6 之间存在这种差异

谁能帮我?

4

1 回答 1

2

这与 JRE 版本无关,而是与您的会话设置有关。您已指定字符串并离开 Oracle 会话以使用 NLS 设置(可能是 NLS_DATE_FORMAT)隐式转换为日期。
帮自己一个忙——永远不要让硬编码的值依赖于外部设置。
你可以DATE'9999-01-01'改用。

于 2013-02-13T06:18:24.380 回答