【发布时间】:2013-02-13 06:04:56
【问题描述】:
我正在使用以下查询获取一些数据
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
现在我的问题是
- 为什么会有这种差异?如果问题出在 to_date() 那么它应该在 SQL 中给出相同的异常 开发人员。
-
问题并没有在这里结束当我再次从 Eclipse 调试我的程序时,我看到相同的查询正在完美运行 在 NVL 块中没有 to_date() 我检查并发现我的 JDK 是 1.5 但 JRE 是 1.6。然后我将 JRE 更改为 1.5 并调试 相同的java程序,发现它产生相同的 例外,对于在 NVL 块中没有 to_date() 的相同查询,在 调试时间。
现在我完全搞砸了为什么会有这样的差异 JRE 5 和 JRE 6?
谁能帮帮我?
【问题讨论】:
-
你能贴出你的java代码吗?
-
这整个
CASE WHEN NVL(...没有意义,为什么不只是NVL( t.settlement_date, t.value_date)呢?或CASE WHEN t.settlement_date is null then ... -
A.B.Cade 你是对的。NVL 时不需要使用 CASE(...。但我担心的是其他问题。如果我使用上面的 sql,它在 SQL DEVELOPER 中运行良好。但是从我的代码中,它产生异常 java.sql.SQLException: ORA-01843: not a valid month.if 我的 sql 不正确,它也应该在 sql developer 中给出相同的异常......
-
@AngshumanDey,因为你已经得到了一个答案 - 当你使用带有日期的 NVL 和字符串时,oracle 会根据
NLS_DATE_FORMAT将你的字符串隐式转换为日期,这在打开的不同会话中可能会有所不同通过不同的工具,始终使用to_date函数显式转换您的字符串日期。 stackoverflow.com/a/14847616/1083652