MySql关于时间查询的技巧
本篇文章讲述一个MySql关于时间查询的技巧。
场景:
需要通过时间段搜索,比如我的页面是element-ui的时间选择器选择查询一个月的时间,也就是我要条件搜索这一个月的数据。
这个时候有一个比较简单的方法,不用知道这个月开始的时间和结束的时间,如果按照以前的方法肯定是 between 开始时间 and 结束时间,但是我们选择的是一个月份,所以要知道结束时间是很麻烦的。
因此,这里的方法就是把前端得到的时间转换成"yyyy-MM",也就是我选择2018年6月,就把这个时间转换成"2018-06",然后把这个时间传给mysql就能识别,在mybatis加条件的时候:create_time like concat(#{chooseMonth},'%') 这样的话就相当于是一个模糊查询,时间的开始是2018-06的时间都会查出来,就达到了查询一个月的数据的效果,也不用那么繁琐。
后台service代码:
public PageInfo<SysFileVO> queryFileList(SysUser sysUser,Map<String, Object> map){ Integer currentPage = Integer.valueOf(map.get("currentPage").toString()); Integer pageSize = Integer.valueOf(map.get("pageSize").toString()); PageHelper.startPage(currentPage, pageSize); map.put("regId",sysUser.getRegId()); Date date = new Date(); String createTime = ""; if (!StringUtil.isEmpty((String) map.get("currentMonth")) && !"1970".equals(((String) map.get("currentMonth")).substring(0,4))){ String time = (String) map.get("currentMonth"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); try { date = sdf.parse(time); createTime = sdf.format(date); map.put("createTime",createTime); } catch (ParseException e) { e.printStackTrace(); } } List<SysFileVO> list = sysFileMapper.queryFileList(map); return new PageInfo(list); }
主要看我标红的代码:currentMonth是从map中取出来的,所以要先转换成字符串,再把字符串转化成时间,再转化成我们需要的字符串。
<select id="queryFileList" parameterType="map" resultMap="FileVOResultMap">
SELECT
sf.file_id,
sf.reg_id,
sf.create_time,
sf.organization,
sf.create_user,
sf.updownload,
sa.attach_id,
sa.file_real_name,
sa.file_show_name,
sa.file_path,
sa.file_type
FROM
sys_file sf
LEFT JOIN sys_attach sa
ON sa.business_id = sf.file_id
WHERE sf.updownload = #{updownload}
AND sf.reg_id = #{regId}
AND sf.file_state = 0
AND sa.file_state = 0
<if test="createTime!=null and createTime!=''">
AND sf.create_time like concat(#{createTime},'%')
</if>
ORDER BY sf.create_time DESC
</select>
这里sql一定要注意 like后面一定要用concat函数去拼接,不能直接#{createTime}+"%"来拼接,这样mysql好像不认识(具体可以试一下,本人没试),