MySQL 里面的 DATE () 函数,作用就是从一个 datetime 或者 timestamp 日期时间表达式里面,提取出纯日期部分,只保留年月日,把后面的时分秒全部去掉,返回值类型是 DATE 类型,格式是 YYYY-MM-DD,很多初学者在做按天统计、分组查询的时候,datetime 字段带有时分秒,直接 group by 就会因为时分秒不一样,同一天的数据分成多组,这个时候就必须使用 DATE () 函数截取成纯日期再分组,这也是 DATE 函数最经典使用场景,它和 DATE_FORMAT 不一样,DATE () 是提取日期,返回原生 DATE 类型,DATE_FORMAT 是把日期转成自定义格式字符串,两者不要混淆,MySQL 还有很多日期相关函数,比如 NOW () 获取当前时间,CURDATE () 获取当前纯日期,CURDATE () 效果等价于 DATE (NOW ()),日常开发经常搭配 WHERE 条件筛选某天数据,比如查询某一天全部订单,直接写 create_time='2026-01-01' 会因为时分秒匹配不到数据,改成 DATE (create_time)='2026-01-01' 就可以正常命中,但是这里有性能注意点,如果字段建立索引,在字段外面套 DATE 函数会导致索引失效,大数据表需要优化写法。
基础语法
DATE(expr)
参数 expr:日期时间表达式,可以是 datetime、timestamp、字符串格式日期
返回:YYYY-MM-DD 纯日期,如果参数非法或者为 NULL,返回 NULL
基础示例
SELECT DATE('2026-11-09 15:30:45');
-- 结果:2026-11-09
SELECT DATE(NOW());
-- 返回当前系统日期,等价 CURDATE()
核心使用场景对照表
| 场景 | SQL 写法 | 说明 |
|---|---|---|
| 按天分组统计 | GROUP BY DATE(create_time) | 把 datetime 转为日期,同一天合并统计 |
| 查询指定某天数据 | WHERE DATE(create_time)='2026-11-09' | 过滤当日全部记录 |
| 对比日期 | WHERE DATE(create_time) > '2026-10-01' | 只比较年月日 |
示例 1 按天分组统计订单数量
SELECT DATE(create_time) AS 日期, COUNT() AS 订单数
FROM orders
GROUP BY DATE(create_time);
示例 2 查询当天全部订单
SELECT FROM orders WHERE DATE(create_time) = '2026-11-09';
重点:索引失效问题(非常重要)
WHERE DATE(create_time) = '2026-11-09'
这种写法,create_time 字段外面套了 DATE 函数,MySQL 优化器无法使用 create_time 普通索引,大数据量查询会全表扫描,性能很差。
✅ 优化推荐写法,改成范围查询,保留索引:
WHERE create_time >= '2026-11-09 00:00:00'
AND create_time < '2026-11-10 00:00:00'
DATE 函数 和 相关日期函数区分
| 函数 | 功能 | 返回类型 |
|---|---|---|
| DATE() | 提取年月日 | DATE 类型 YYYY-MM-DD |
| CURDATE() | 获取当前纯日期 | DATE 类型 |
| NOW() | 获取当前日期 + 时分秒 | DATETIME |
| DATE_FORMAT() | 自定义格式化日期为字符串 | 字符串 |
| YEAR() MONTH() DAY() | 单独提取年 月 日 | 数字 |
常见报错与异常
1 参数不是合法日期格式,DATE 函数返回 NULL,不会自动报错,写 SQL 的时候要注意脏数据
2 MySQL 5.7 和 8.0 DATE 函数行为基本一致,没有大改动
3 如果字段是字符串 varchar 存储日期,DATE () 也可以转换,但是不推荐 varchar 存日期,查询性能和校验都很差
【常见问题】
问题 1 mysqldate 函数 DATE () 和 CURDATE () 结果一样吗
回答 1 mysqldate 函数,DATE (NOW ()) 和 CURDATE () 返回结果都是 YYYY-MM-DD 纯日期,效果相同,但是 DATE 函数可以处理任意 datetime 字段,CURDATE 只能获取系统当前日期。
问题 2 mysqldate 函数 使用 DATE 之后索引为什么失效
回答 2 mysqldate 函数,字段外层包裹 DATE 函数之后,MySQL 优化器不能命中普通索引,大数据表建议改成时间范围查询,避免全表扫描。
问题 3 mysqldate 函数 DATE () 和 DATE_FORMAT 区别是什么
回答 3 mysqldate 函数,DATE () 是提取原生 DATE 日期类型,DATE_FORMAT 是把日期转成自定义格式字符串,比如 % Y% m% d,返回的是文本,不是日期类型。
问题 4 mysqldate 函数 可以提取时分秒吗
回答 4 mysqldate 函数,DATE 函数只能提取年月日,不能提取时分秒,如果要提取时分秒,可以使用 TIME () 函数,搭配 DATE () 一起使用。
【免责申明】
本文基于 MySQL 5.7 / 8.0 通用语法编写,不同小版本细节存在差异,生产环境修改 SQL 前建议在测试库验证,大表索引优化方案需要结合实际表结构评估。


