mybatis对于一段时间内的数据查询

导读:本篇文章讲解 mybatis对于一段时间内的数据查询,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

项目中有个场景需要查询一段时间内的记录,比如,查询指定用户今天的收藏记录

测试场景重现

前提

数据库中数据:有一条更新时间为【2019-01-01 15:10:20】的数据

img

查询条件

开始日期:2019-01-01 14:00:00
结束日期:2019-01-01 15:20:30
model_id: Buw2y9CQMmc1tX7HQw9MLx
scene_id: scene1

查询结果

0条记录

问题追踪

可能的原因:

  1. 时区问题(排除)
  2. 传参问题(参数不正确,排除)
  3. 返回值问题(date和string的转换,排除)
  4. 查询方式问题(靠点谱,接着看)

当时间传参方式为date或 timestamp 格式时,查询开始日期和结束日期时间差超过一天时,查询结果正常;

当开始日期和结束日期时间差在一天内时,查询结果异常

传参方式为Date类型(java.util.Date)(查询结果个数为 0):

## Mapper.xml
<select id = "getTimes"  parameterType="map" resultType="java.lang.Integer">
  select
	count(*)  from t_model_monitor
  where scene_id =#{sceneId}
  and model_id= #{modelId}
  <if test="start != null">
  and  DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%S') >=  DATE_FORMAT(#{start,jdbcType=Date }, '%Y-%m-%d
  %H:%i:%S')
  </if>
  <if test="end != null">
  and  DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%S') <= DATE_FORMAT(#{end,jdbcType=Date }, '%Y-%m-%d
  %H:%i:%S')
  </if>
  and monitor =#{type}
  and is_delete
  = 0
</select>

传参方式为Timestamp类型(查询结果个数为 0):

## Mapper.xml  
<select id = "getTimes"  resultType="java.lang.Integer">
	  select
		  count(*)
	  from t_model_monitor
	  where scene_id =#{sceneId}
	  and model_id= #{modelId}
	  and monitor =#{type}
	  and is_delete= 0
	  <if test="end != null">
		<![CDATA[ and DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%S')<=  DATE_FORMAT(#{end,jdbcType = TIMESTAMP}, '%Y-%m-%d %H:%i:%S')  ]]>
	  </if>
	  <if test="start != null">
		<![CDATA[ and DATE_FORMAT(update_time,'%Y-%m-%d %H:%i:%S')>=  DATE_FORMAT(#{start,jdbcType = TIMESTAMP}, '%Y-%m-%d %H:%i:%S')  ]]>
	  </if>
</select>

试了一下传参方式为String(正常查询):

## Mapper.xml
<select id = "getTimes"  resultType="java.lang.String">
	select
	distinct DATE_FORMAT(update_time, '%Y-%m-%d %H:%i:%S') as update_time
	from t_model_monitor
	where scene_id =#{sceneId}
	and model_id= #{modelId}
	<if test="start != null" >
	  and update_time &gt;#{start}
	</if>
	 <if test="end != null" >
	and update_time &lt; #{end}
	</if>
	and monitor =#{type}
	and is_delete
	= 0 
</select>

结论

当查询一段时间内的数据时,如果时间精确到时分秒,建议时间传参用String类型!
Mybatis中jdbcType为Date和 TimeStamp的区别:

  • jdbcType = “Date” ,返回的时间只有年月日(yyyy-MM-dd)
  • jdbcType = “TimeStamp” ,返回的时间年月日和时分秒都有(yyyy-MM-dd HH:mm:ss)

总结

当查询一段时间内的数据时,如果时间精确到时分秒,建议时间传参用String类型!

余留问题

为什么 Date类型和TimeStamp类型会失效?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69694.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!