解决MySQL日期格式差异引发的查询bug:精确匹配与按日期截断比较

前言

在开发过程中,我们常常会遇到由于日期格式不匹配而导致的数据查询异常问题。今天,我就碰到了这样一个场景:在使用MyBatis Plus的Lambda表达式进行时间范围查询时,由于数据库中createTime字段的格式与前端传来的查询参数格式不符,导致预期的数据无法正确查询出来。

问题描述

在使用MyBatis Plus的动态查询条件LambdaQueryWrapper时,代码如下:

java 复制代码
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
    SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));

其中,SysOss表中的createTime字段存储的是yyyy-MM-dd HH:mm:ss格式的时间戳,而前端传过来的查询参数beginCreateTimeendCreateTime则是yyyy-MM-dd格式的日期。这就导致了一个问题:当我们想查询某一天的全部记录时,比如数据库中有一条记录为2024-03-26 19:07:00,而查询条件为beginCreateTimeendCreateTime都为2024-03-26,原生的between条件查询因为时间精度不匹配而查不到这条记录。

解决方案

针对这个问题,我提出了两种不同的解决策略。

方案一:扩展查询条件至当日最末时刻

修改查询条件为:

java 复制代码
// 注意23:59:59前的空格不能省略
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
    SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime") + " 23:59:59");

在这个方案中,我们将结束时间参数endCreateTime扩展为当天的23点59分59秒,这样一来,只要createTime在指定日期的任何时刻都会被包含在查询范围内。

方案二:按日期截断进行比较

另外一种更为精准的解决方案是调整SQL语句,使其仅基于日期部分进行比较:

java 复制代码
// 开始时间
lqw.apply(params.get("beginCreateTime") != null, 
    "date_format(`create_time`, '%Y-%m-%d') >= date_format({0}, '%Y-%m-%d')", params.get("beginCreateTime"));

// 结束时间
lqw.apply(params.get("endCreateTime") != null, 
    "date_format(`create_time`, '%Y-%m-%d') <= date_format({0}, '%Y-%m-%d')", params.get("endCreateTime"));

这种方式中,我们利用MySQL的date_format函数将createTime字段转换为日期格式并与查询参数进行比较,确保只关注日期部分而不考虑具体时间。

总结

通过对日期查询方式进行适当的调整,我们成功解决了由于日期格式不一致引发的查询bug。两种方案各有优势,第一种方案简洁直观,适用于无需严格区分同一天内不同时间记录的情况;第二种方案更为严谨,确保了按自然天进行精确筛选。在实际开发中,可以根据业务需求选择合适的解决方案。

相关推荐
AAA修煤气灶刘哥17 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
程序新视界18 小时前
学习MySQL绕不开的两个基础概念:聚集索引与非聚集索引
mysql
RestCloud21 小时前
跨境数据传输:ETL如何处理时区与日期格式差异
mysql·api
RestCloud21 小时前
揭秘 CDC 技术:让数据库同步快人一步
数据库·api
得物技术1 天前
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
数据库·后端·mysql
xiaok1 天前
mysql中怎么创建一个可控权限数据库账号密码给到开发者
mysql
可涵不会debug1 天前
【IoTDB】时序数据库选型指南:工业大数据场景下的技术突围
数据库·时序数据库
ByteBlossom1 天前
MySQL 面试场景题之如何处理 BLOB 和CLOB 数据类型?
数据库·mysql·面试
玉衡子1 天前
九、MySQL配置参数优化总结
java·mysql
麦兜*1 天前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud