多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

mysql date(datetime) 和date类型字段比较是同一天

mysql date(datetime) 和date类型字段比较是同一天 在 MySQL 中DATE类型例如2026-09-02和DATETIME类型例如2026-09-02 14:30:45直接使用比较通常是不相等的。因为 MySQL 在比较时会默认将DATE隐式转换为当天的零时零分零秒即2026-09-02 00:00:00导致2026-09-02 14:30:45无法和它匹配。如果要判断它们是否属于同一天通常有三种写法按性能从高到低排列推荐方法范围查询最健壮能走索引由于你之前特别关注性能这是首选方法。将DATE字段作为起点寻找当天00:00:00到次日00:00:00不包含之间的数据sql-- 假设 datetime_col 是 DATETIME 字段date_col 是 DATE 字段 SELECT * FROM 表名 WHERE datetime_col date_col AND datetime_col DATE_ADD(date_col, INTERVAL 1 DAY);原理如果date_col是2026-09-02那么条件就变成了datetime_col 2026-09-02 00:00:00 AND datetime_col 2026-09-03 00:00:00完美覆盖当天所有时间点且完全不会导致索引失效。直接方法使用 DATE() 函数简单但会导致索引失效如果你只需要“简单粗暴”地剥离时间进行比较可以使用DATE()函数sqlSELECT * FROM 表名 WHERE DATE(datetime_col) date_col;⚠️ 重要提示如果你把DATE()用在了有索引的字段上即datetime_col这列MySQL 将无法使用该字段的索引必须全表扫描全表扫描数据量大了会非常慢。建议只在小表或数据量少的场景使用。特殊情况区分如果两个字段都是DATE类型直接使用WHERE datetime_col date_col即可。如果一个是DATETIME另一个是常量字符串sql-- 直接比较字符串注意必须带具体时间 WHERE datetime_col 2026-09-02 00:00:00 -- 或者查询当天配合范围 WHERE datetime_col 2026-09-02 AND datetime_col 2026-09-03如果强制把两个都转成日期再比极端不推荐sqlWHERE DATE(datetime_col) DATE(date_col) -- 多余的转换且更慢 最佳实践总结结合你上一个问题中gross_time字段的场景最标准、性能最好的写法永远是把左边的 DATETIME 字段卡在日期的边界上sqlWHERE gross_time 2026-09-02 AND gross_time 2026-09-03这样既做到了“同一天”又保证了查询速度。
返回列表