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

相关推荐
草莓熊Lotso3 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
大模型玩家七七3 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
岳麓丹枫0014 小时前
PostgreSQL 中 pg_wal 目录里的 .ready .done .history 文件的生命周期
数据库·postgresql
陌上丨10 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_567810 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw10 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307311 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道11 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据12 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务12 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考