我还知道Oracle DATE类型具有年、月、日、小时、分钟和秒的时间字段。但没有小数秒和时区。
我注意到在Java 6和Java 8中同一查询的行为不同:
private static final String REQUETE_LISTE_CALENDRIER_DATE =
" SELECT ID_DATE, JOUR" +
" FROM CALENDRIER " +
" WHERE ID_DATE = ? ";
将定义如下的java.sql.Date“dateCourante”(它设置这些时间字段的值)绑定到PreparedStatement
中:
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');
给出的信息如下:
2016年8月26日 00:00:00
据我所知,以下是Java 6和Java 8中java.sql.Date的不同之处:
- 在Java 6中,在将查询发送到数据库之前,
java.sql.Date
的时间字段会被设置为零。 - 而在Java 8中,
java.sql.Date
的时间字段在查询中保持不变。
我无法找到关于此行为的文档说明。
有人可以确认或解释一下吗?
作为解决方法,可以使用以下代码,如此处所述:
dDate = java.sql.Date.valueOf(dDate.toLocalDate()); //其中dDate是java.sql.Date类型的
java.sql.Date
的实现不会截断提供的毫秒值(如果我没记错的话,它从来没有这样做过);javadoc 中的文本是对驱动程序开发人员如何处理它的指导。因此问题很可能是Oracle驱动程序如何处理它。 - Mark Rotteveel