解决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。两种方案各有优势,第一种方案简洁直观,适用于无需严格区分同一天内不同时间记录的情况;第二种方案更为严谨,确保了按自然天进行精确筛选。在实际开发中,可以根据业务需求选择合适的解决方案。

相关推荐
Oueii1 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
未来龙皇小蓝2 小时前
【MySQL-索引调优】11:Group by相关概念
数据库·mysql·性能优化
2401_831824962 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
njidf2 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
twc8292 小时前
大模型生成 QA Pairs 提升 RAG 应用测试效率的实践
服务器·数据库·人工智能·windows·rag·大模型测试
@我漫长的孤独流浪2 小时前
Python编程核心知识点速览
开发语言·数据库·python
2401_851272992 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python
枕布响丸辣2 小时前
MySQL 从入门到精通:完整操作手册与实战指南
数据库·mysql
电商API&Tina3 小时前
【电商API接口】开发者一站式电商API接入说明
大数据·数据库·人工智能·云计算·json
2401_857918293 小时前
用Python和Twilio构建短信通知系统
jvm·数据库·python