[java处理时间范围查询的问题记录
每天一个问题小记录,今天的问题如下:
在开发中,我们经常会有遇到这样的功能,就是时间范围查询
比如我们有一个a表,表中有字段create_time,如图
这个时候我们可以将查询条件的时间定义为如下:`
private String startTime;
private String endTime;
对应的mapper如下:
<if test="dto.startTime != null and dto.startTime != ''">
and date_format(qm.create_time, '%Y-%m-%d') >= #{dto.startTime}
</if>
<if test="dto.endTime != null and dto.endTime != ''">
and date_format(qm.create_time, '%Y-%m-%d') <= #{dto.endTime}
</if>
这个时候结果是没问题的,对应的查询日志如下
==> Parameters: 2023-11-16(String), 2023-12-27(String)
可以看到时间是正确的
2.不过我们也可以这样写,用Date去接收查询条件,对应的代码如下:
import org.springframework.format.annotation.DateTimeFormat;
@ApiModelProperty(value = "提交开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date startTime;
@ApiModelProperty(value = "提交结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date endTime;
这个时候对应的mapper如下:
<if test="dto.startTime != null">
and qm.create_time >= #{dto.startTime}
</if>
<if test="dto.endTime != null">
and qm.create_time <= #{dto.endTime}
</if>
这里如果前端传参格式不是 2023-11-16这样的话,会报错,也算是一个校验吧,但是问题是什么呢,我们看日志
==> Parameters: 2023-11-16 08:00:00.0(Timestamp), 2023-12-27 08:00:00.0(Timestamp)
可以看到这里自动给加了时间,都是上午8点,那会不会查不出来27号下午的结果呢,我们搞一条试试,这里把数据库的时间改成
2023-12-27 12:50:31,然后查询发现没有返回,说明这里只会得到早上8点前的结果,这就是个问题了
这个如果测试没注意,就很难发现
最后,如果聪明可爱的你发现了本次分享的问题,不要懒惰哈,动动你的小手,评论区让我也学习一下哦