我正在使用SQL Server数据库和Hibernate。我有以下与存储日期相关的问题:
我有以下代码:
String hql = "select user from User user where user.createDate = :date";
Query query = HibernateUtil.getSession().createQuery(hql);
Date date2 = DateHelper.getEndOfDay(new Date());//this returns 2010-07-27 23:59:59.999
query.setParameter("date", date2);
当我比较日期2010-07-27 23:59:59.999
时,我得到的结果是日期:2010-07-28 00:00:00.0
。使用setDate()而不是setParameter()将返回保存日期在同一天的用户,这意味着将丢弃小时,分钟等。
hibernate将日期映射到java.util.Date,但在结果列表中,所有内容都是Timestamp,因为Timestamp扩展了java.util.Date。 为了在比较平等时取得好成绩,你有什么建议?
答案 0 :(得分:1)
您是否尝试过Query.setDate()
或Query.setTimestamp()
?
答案 1 :(得分:1)
我认为问题在于MSSQL数据库,因为它以3毫秒的精度保存日期,如this帖子的答案中所示。
所以问题是因为时间23:59:59.999无法保存在MSSQL中(可能具有3毫秒的精度,当你比较从数据库中检索的时间时,你不能得到999这次必须转换,当将它转换为某个MSSQL兼容日期,它最终会在第二天结束。
我认为这是我在这里看到的真正问题。为了避免这种情况,我想我应该格式化我正在保存的日期。
答案 2 :(得分:0)
如果可能,建议您使用JODA DateTime API。使用DateTime中的PersistentDateTime Hibernate User Type类将joda-hibernate project对象保留到数据库。