前言
项目中有个场景需要查询一段时间内的记录,比如,查询指定用户今天的收藏记录
测试场景重现
前提
数据库中数据:有一条更新时间为【2019-01-01 15:10:20】的数据
查询条件
开始日期:2019-01-01 14:00:00
结束日期:2019-01-01 15:20:30
model_id: Buw2y9CQMmc1tX7HQw9MLx
scene_id: scene1
查询结果
0条记录
问题追踪
可能的原因:
- 时区问题(排除)
- 传参问题(参数不正确,排除)
- 返回值问题(date和string的转换,排除)
- 查询方式问题(靠点谱,接着看)
当时间传参方式为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 >#{start}
</if>
<if test="end != null" >
and update_time < #{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