java处理时间范围查询的问题记录

文章讨论了Java开发中使用DateTimeFormat处理时间范围查询时,当接收的前端参数不是标准格式,如2023-11-16,会自动添加上午8点,导致可能无法正确查询到指定时间段的数据,尤其是跨天情况。
摘要由CSDN通过智能技术生成

[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') &gt;= #{dto.startTime}
        </if>
        <if test="dto.endTime != null and dto.endTime != ''">
            and date_format(qm.create_time, '%Y-%m-%d') &lt;= #{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 &gt;= #{dto.startTime}
            </if>
            <if test="dto.endTime != null">
                and qm.create_time &lt;= #{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点前的结果,这就是个问题了
这个如果测试没注意,就很难发现
最后,如果聪明可爱的你发现了本次分享的问题,不要懒惰哈,动动你的小手,评论区让我也学习一下哦

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值