SQL中的日期选择错误

时间:2016-11-30 18:02:46

标签: java mysql hibernate date

我正在使用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'

返回一条记录。

我怀疑这是一个数据类型问题或类似问题,但在网络上进行研究后,我不清楚。

是的,有人能帮帮我吗?

提前致谢!

3 个答案:

答案 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的知识!