我正在使用Hibernate 4.3.8.Final,Primefaces 6.0和MySQL Database 5.7.13。 我在数据库中有一个具有这种结构的表:
CREATE TABLE `rents` (
`rent_code` INT NOT NULL AUTO_INCREMENT,
`rent_daystart` datetime default NULL,
`rent_dayend` datetime default NULL,
PRIMARY KEY (`rent_code`)
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_unicode_ci;
使用以下SQL通过Squirrel提取以下数据:
select * from rents
rent_code | rent_daystart | rent_dayend
1 | 2016-11-30 16:03:00.0 | 2016-12-01 16:03:00.0
在我的Java bean中,我有以下功能:
public List<Object> getRents(java.util.Date iniDate, java.util.Date endDate){
String SQL="select rent_code from rents where rent_daystart < :inidate and rent_dayend > :enddate";
List<Object> allRecords = null;
Session sesion=HibernateUtil.getSessionFactory().openSession();
try {
sesion.beginTransaction();
Query query = sesion.createSQLQuery(SQL).setDate("inidate", iniDate).setDate("enddate", endDate);
allRecords = query.list();
sesion.getTransaction().commit();
sesion.close();
}
catch (HibernateException he) {
//exception control code
};
return allRecords;
}
我执行web APP调试,函数收到的日期是:
**inidate** = 'Wed Nov 30 17:54:00 CET 2016'
**enddate** = 'Wed Nov 30 18:54:00 CET 2016'
它在所有时候都没有返回记录。
如果我以松鼠的方式执行相同的SQL:
select rent_code from rents where rent_daystart < '2016-11-30 17:54:00' and rent_dayend > '2016-11-30 18:54:00'
返回一条记录。
我怀疑这是一个数据类型问题或类似问题,但在网络上进行研究后,我不清楚。
是的,有人能帮帮我吗?提前致谢!
答案 0 :(得分:0)
java.util.Date类不处理时区。除非您在Date实例和数据库字段中使用相同的时区,否则很容易使创建您所看到的行为的时区不匹配。尝试以UTC格式显示java Date,以UTC格式查看数据库日期,看看它们是否符合您的预期。
答案 1 :(得分:0)
如果从代码传递的值与数据库中预期的值之间的日期格式不匹配,则使用SimpleDateFormat在传递给数据库之前更改日期值的格式
SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = dt.parse(iniDate);
答案 2 :(得分:0)
好吧,我发现了这个问题。如Compare Date Java to DateTime Column in database table using SQL中所述,我正在使用&#34; .setDate&#34;函数设置日期,这样的函数截断时间部分,这是问题。现在我使用&#34; .setTimestamp&#34;它使用日期和时间部分。 感谢大家的帮助,我学到了很多关于TimeZones的知识!