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

Rod*_*djf 5 java sql oracle date java-8

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

我也知道Oracle DATE类型 确实具有 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 = ? ";
Run Code Online (Sandbox Code Playgroud)

绑定到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"
Run Code Online (Sandbox Code Playgroud)
  • 使用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');
Run Code Online (Sandbox Code Playgroud)

这给了:

2016/08/26 00:00:00

所以,我的理解是:

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

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

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

作为一种变通方法,我用这个,如所解释这里:dDate = java.sql.Date.valueOf(dDate.toLocalDate()); //其中dDate是java.sql.Date

小智 1

Java SE 8 还提供了一些其他常见用例的类。

YearMonth

有一个MonthDay类,其中包含一个月和一天。可用于表示生日。

MonthDay

YearMonth课程涵盖信用卡开始日期和到期日期用例以及人们有没有指定日期的日期的场景。

数据库连接4.2

Java SE 8 中的 JDBC 将支持这些新类型,但公共 JDBC API 不会发生任何更改。现有的通用 setObject 和 getObject 方法就足够了。