OJDBC 14 隐式日期转换?

Posted

技术标签:

【中文标题】OJDBC 14 隐式日期转换?【英文标题】:OJDBC 14 implicite date conversion? 【发布时间】:2013-09-16 14:58:50 【问题描述】:

我们将 ojdbc14_10.1.0.2.jar 与 Java/J2EE 应用程序(直接使用 JDBC)和 JDK5 一起使用,但是当我们尝试迁移到 ojdbc5-11.2.0.3.jar 时,我们遇到了与某些 sql 相关的问题不再起作用的请求(jdbc)。

伪SQL请求是:

select *
from quotas q 
where q.datdeb<='2013-09-05' and q.datfin>='2013-09-05' 
and q.datdeb is not null and q.datfin is not null order by ....;

日期的 NLS 参数是: DD/MM/RR

这与请求中作为参数给出的日期格式不兼容。

当我们使用 ojdbc14 时一切正常;显然它对日期进行了隐式转换。

有关信息,Oracle 数据库是 11g 版本 11.2.0.3.0 - 64 位

最好的问候。

【问题讨论】:

【参考方案1】:

我相信您只需要使用带有适当日期掩码的 to_date 函数即可解决此问题。

select *
from quotas q 
where q.datdeb<=to_date('2013-09-05','yyyy-mm-dd') and q.datfin>=to_date('2013-09-05', 'yyyy-mm-dd')
and q.datdeb is not null and q.datfin is not null order by ....;

【讨论】:

是的当然这是一个很好的解决方案,但是我忘了提到Java/J2EE应用程序包含很多以日期为参数的sql请求,所以影响会很大并且有很大的影响回归风险。由于应用程序在 Apache Tomcat 下运行,是否有任何 Tomcat 参数可以在将 sql 日期参数发送到 Oracle 之前隐式转换它们? quota.datdeb、quota.datfin的数据类型是什么?另外,参数是日期还是字符串? quotas.datdeb, quotas.datfin 是数据库中的日期,并且给出的参数也是日期(java.util.Date),所以在 Java/J2EE 应用程序中它们被转换为 YYYY-MM-DD但数据库接受 DD/MM/RR 格式的日期。所以当我们使用 OJDBC14 时我们没有问题(我猜 OJDBC14 隐式转换了 sql 参数日期)但是当我们迁移到 OJDBC5 时我们开始遇到这个问题。

以上是关于OJDBC 14 隐式日期转换?的主要内容,如果未能解决你的问题,请参考以下文章

从数据类型varbinary到日期SQL服务器的隐式转换

数据类型从 varchar2 到日期、数字等的隐式转换

DataContractJsonSerializer DateTime 隐式时区转换

scala时间戳转换

如何在雪花中将时间戳转换为日期

求助:sqlserver数据库中的日期格式怎么转换