需求
- 查询某年、某月、某日数据信息
实现 (createTime时间为例)
sql实现方式:
SELECT * FROM table WHERE ${开始时间}<=createTime<=${结束时间}
- hql 实现方式:
FROM tableEntity WHERE ${开始时间}<=createTime<=${结束时间}`
问题
- 每次查询类似的时间维度数据,必须先找到这个时间维度的开始时间和结束时间,这个流程我是比较讨厌的。比如我要查询2016年到2017年数据,那么就需要找到2016年初的第一刻时间,到2016年最后时刻时间。虽然都会使用工具类处理,但是每次都这么写还算是比较崩溃,特别是查询这种数据一次性涉及的表比较多的情况。
相对好的解决方式
- 搜索了不少博客,没有直接提到如何更好的书写这种查询,不过搜到了hql支持的一些函数Hibernate中HQL函数汇总及其说明,里面hql支持的函数还算是不少。其中主要关注到有时间提取的函数YEAR(d)、MONTH(d)、DAY(d)、HOUR(d)、MINUTE(d)、SECOND(d)…有这些就足够我们做一定时间维度的查询,具体函数意思可以参考博客。还是以2016至2017年时间数据为例,以上hql就可以修改为:
FROM tableEntity WHERE YEAR(createTime) = 2016
- 如果说要查询当前时间年月数据可修改为(其他类推):
FROM tableEntity WHERE YEAR(createTime) = YEAR(#{当前时间}) AND MONTH(createTime) = MONTH(#{当前时间})
如此就不需要每次都要先去通过工具类找到开始结束时间
最后
- 感觉这种写法也不是特别好的处理,不知道还有没有更好的写法,这里先做记录。另外,我查了一下mysql也有该种函数,写生sql也可以参考hql查询时间维度。