Java 8中的java.sql.Date与Java 6相比

我知道java.sql.Date应该将小时,分钟,秒和毫秒设置为零,以符合标准sql日期的定义.这记录在here(Java 8中相同).

我也知道Oracle DATE type确实有YEAR,MONTH,DAY,HOUR,MINUTE和SECOND这些时间字段.但没有分数秒和时区.

我注意到Java 6和Java 8中的相同查询行为不一样:

private static final String REQUETE_LISTE_CALENDRIER_DATE = 
    " SELECT ID_DATE,JOUR" +
    " FROM CALENDRIER " +
    " WHERE ID_DATE = ? ";

绑定到PreparedStatement的java.sql.Date“dateCourante”定义如下(它将值设置为那些时间字段):

GregorianCalendar gregorianCalendar = new GregorianCalendar(); // "now"
java.sql.Date dateCourante = new java.sql.Date(gregorianCalendar.getTime().getTime()); // date AND time of "now"

>使用Java 6,我找到了一个值,
>使用Java 8,我没有.

在我的数据库中,日期的小时,分​​钟,秒为零.我们可以查看以下查询

select to_char(id_date,'DD/MM/YYYY HH24:MI:SS')
from calendrier
where id_date = to_date('26/08/2016','DD/MM/YYYY');

这给了:

26/08/2016 00:00:00

所以,我的理解是:

>在Java 6中,在数据库上启动查询之前,java.sql.Date的时间字段设置为零
>在Java 8中,java.sql.Date的时间字段保留在查询中.

我无法找到有关此行为的文档.

任何人都可以确认或解释吗?

作为解决方法,我使用它,如here所述:
dDate = java.sql.Date.valueOf(dDate.toLocalDate()); //其中dDate是java.sql.Date

最佳答案
虽然我没有解释,但是说很多人用最新一代的Oracle驱动程序报告了问题和违反JDBC的行为,我可以说你滥用这些类.还有更好的课程.

java.sql.Date是仅限日期的

您在Java端选择了错误的类.虽然java.sql.Date类确实在其内部设置了UTC中00:00:00的时间,但您应该忽略该事实,如类文档所指示的那样. java.sql.Date用于仅限日期的值,没有时间和没有时区.

这个类是一个糟糕的设计,一个糟糕的黑客,继承自java.util.Date,同时告诉你忽略该继承事实.

java.sql.Timestamp是日期和时间

java.sql.Timestamp是您需要的类型而不是java.sql.Date.(但请继续阅读以获得更好的课程.)

从最早的Java版本开始,一大堆旧的日期时间类是一个勇敢的行业首次尝试解决日期时间处理问题,但它们不足.它们的设计很糟糕,令人困惑,也很麻烦.避免它们:java.util.Date,java.util.Calendar,java.util.GregorianCalendar,java.text.DateFormat,java.text.SimpleDateFormat.如果可能的话,也要避免使用java.sql类型.而是使用java.time类.

JDBC 4.2

从JDBC 4.2开始,您的JDBC驱动程序可能能够直接从您的数据库访问java.time类型. PreparedStatement :: setObject和ResultSet :: getObject方法可能能够将数据库中的日期时间值作为java.time对象呈现.

Instant instant = myResultSet.getObject( 1 );

…也许…

Instant instant = myResultSet.getObject( 1,Instant.class );

如果您的驱动程序不那么强大,那么请简单地转换为java.sql类型并立即转换为java.time.使用java.time完成所有业务逻辑.仅适用于与数据库交换数据的java.sql类型.要转换为/从java.time,请查找添加到旧类的新方法.例如,java.sql.Timestamp::toInstant.

这里我们从ResultSet中提取java.sql.Timestamp并立即将其转换为Instant.您可能希望在两行而不是一条组合行上执行此操作以进行调试.

Instant instant = myResultSet.getTimestamp( 1 ).toInstant();

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...