数据库表部分数据:
SQL> select * from t_class; CLASS_ID CLASS_NAME CLASS_CREATETIME ----------- ------------------------------------------------------------ -------------------------------------------------------------------------------- 1 班级1 22-1月 -08 03.03.52.717000 下午 9 班级2 20-1月 -08 05.04.30.577000 上午 18 班级3 15-3月 -08 11.08.03.204000 上午 28 班级4 23-3月 -08 06.05.03.040000 下午 39 班级5 24-4月 -08 01.22.50.090000 下午 |
关键:注意类型匹配,看比较的是日期类型还是字符串类型。
//查询2008-1月-1日到2008-2月-1日建立的班级 String hql = "select c.id, c.name from MyClass c where c.createTime between ? and ?";//这里的问号要传入的是日期对象 //在hql中可以使用数据库的函数,如:Mysql数据库中的date_format SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List list =session.createQuery(hql) .setParameter(0,format.parse("2008-01-01 00:00:00"))//此时应传入Date类型 .setParameter(1,format.parse("2008-01-31 23:59:59")) .list(); |
查询2008-1月建立的班级: 可以利用数据库中的函数,但要注意不同数据库的函数可能不同:例如Mysql中有date_format函数,而oracle中则是用to_char将日期转为指定形式的字符串 String hql = "select c.id, c.name from MyClass c where to_char(c.createTime,'yyyy-MM')=?"; //如果是mysql数据库,where条件应该使用date_format函数写成date_format(c.createTime,'%y-%M')=? List list = session.createQuery(hql).setParameter(0,"2008-01").list();//此时应传入字符串类型,应为to_char已将日期转为指定形式的字符串 |
也可以使用oracle数据的函数to_date,将传入的字符串转化为指定格式的日期对象 String hql = "select id,name from MyClass c where c.createTime between to_date(?,'yyyy-MM-dd HH24-mi-ss') and to_date(?,'yyyy-MM-dd HH24-mi-ss')"; List list = session.createQuery(hql) .setParameter(0,"2008-01-01 00:00:00") .setParameter(1,"2008-01-31 23:59:59") .list(); 注意oracle中使用to_date时有可能出现如下报错: (1)ERROR JDBCExceptionReporter:101 - ORA-01810: 格式代码出现两次 这是由于输入日期模式时输入的是:yyyy-MM-dd HH24-mm-ss。oracle认为出现了两次mm,将分钟的mm改为mi。 (2)ERROR JDBCExceptionReporter:101 - ORA-01849: 小时值必须介于 1 和 12 之间 如果要使用24小时制要写成:'yyyy-MM-dd HH24-mi-ss',而不能直接写yyyy-MM-dd HH-mi-ss' |