当前位置: 首页 > news >正文

DATE_FORMAT可以接收date类型,也可以接收String类型!

DATE_FORMAT 是 SQL 函数,主要用于将日期/时间类型的字段按照指定格式转换成字符串。在 MyBatis 的 XML 动态 SQL 中,你看到的这段代码是为了比较数据库中的日期字段和传入参数的日期值,但会忽略时间部分,只比较年月日。


代码解释

<if test="closeDate != null and closeDate != ''">AND DATE_FORMAT(close_date, '%Y-%m-%d') = DATE_FORMAT(#{closeDate}, '%Y-%m-%d')
</if>
  1. DATE_FORMAT(close_date, '%Y-%m-%d')
    • 将数据库中的 close_date 字段(假设是 DATETIMETIMESTAMP 类型)格式化成 年-月-日 的字符串(例如 2023-10-05),忽略时间部分。

  2. DATE_FORMAT(#{closeDate}, '%Y-%m-%d')
    • 将传入的参数 closeDate 也格式化成 年-月-日 的字符串,确保两者格式一致。

  3. AND ... = ...
    • 比较格式化后的字符串,实现“仅按日期比较,忽略时间”的效果。


为什么需要这么做?
• 场景:假设数据库中的 close_dateDATETIME 类型(例如 2023-10-05 14:30:00),而传入的 closeDate 参数可能是一个带时间的日期(例如 2023-10-05 08:15:00),直接比较会导致不匹配。

• 解决:通过格式化将两者的时间部分去掉,只比较日期部分(2023-10-05)。


参数 closeDate 的常见类型

  1. Java 中的 Date 类型
    • 如果 closeDatejava.util.Date,MyBatis 会将其转为数据库的 DATETIME 类型,再调用 DATE_FORMAT

  2. 字符串类型
    • 如果 closeDate 是字符串(如 "2023-10-05"),DATE_FORMAT 会尝试将其解析为日期,再格式化。但需确保字符串格式与数据库兼容(例如 yyyy-MM-dd)。


潜在问题

  1. 性能影响
    • 对数据库字段 close_date 使用 DATE_FORMAT 会导致索引失效(因为字段被函数处理后比较),大数据量时可能影响性能。

    • 改进方案:改用范围查询(如 close_date BETWEEN '2023-10-05 00:00:00' AND '2023-10-05 23:59:59')。

  2. 时区问题
    • 如果数据库和应用程序的时区不同,格式化后的日期可能不一致,需要确保时区统一。


其他替代方案(推荐)
如果使用 MySQL,可以用 DATE() 函数直接提取日期部分:

AND DATE(close_date) = DATE(#{closeDate})

• 更简洁,但同样有索引失效问题。


总结
• 目的:比较日期部分,忽略时间。

• 代价:可能影响性能,需根据数据量权衡。

• 最佳实践:如果允许,尽量用数据库的日期范围查询(如 BETWEEN)。

http://www.xdnf.cn/news/486127.html

相关文章:

  • this.$set的用法-响应式数据更新
  • oracle主备切换参考
  • 初学者如何用 Python 写第一个爬虫?
  • 【LLM】大模型落地应用的技术 ——— 推理训练 MOE,AI搜索 RAG,AI Agent MCP
  • ​小店推客系统开发SEO全攻略:从技术架构到流量裂变,打造私域增长引擎
  • Android framework 中间件开发(二)
  • 贝叶斯英文单词拼写纠错器(Python)
  • 小型研发团队的项目管理:挑战与高效工具推荐
  • 实时数据流处理的利器:如何利用 Spark Streaming 让数据动起来?
  • Java 流(Stream)API
  • CSS- 3.1 盒子模型-块级元素、行内元素、行内块级元素和display属性
  • MySQL高效开发规范
  • 不清楚的点
  • RNope:结合 RoPE 和 NoPE 的长文本建模架构
  • git相关配置
  • 深入理解 this 指向与作用域解析
  • 使用 gcloud CLI 自动化管理 Google Cloud 虚拟机
  • AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)
  • FreeSWITCH Jitter Buffer 技术解析与应用指南
  • OpenCV边界填充(Border Padding)详解:原理、方法与代码实现
  • TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。
  • 【AI模型部署】
  • [模型部署] 1. 模型导出
  • 使用DDR4控制器实现多通道数据读写(十二)
  • 文章记单词 | 第88篇(六级)
  • ReentrantLock类详解
  • Spark,SparkSQL操作Mysql, 创建数据库和表
  • 【美团】Java后端一面复盘|网络+线程+MySQL+Redis+设计模式+手撕算法
  • Neo4j 图书馆借阅系统知识图谱设计
  • Servlet 深度解析:生命周期、请求响应与状态管理