首页 >> 优选问答 >

问mysqldate 函数 DATE 函数用法详解

2026-11-09 18:19:20

答

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 前建议在测试库验证,大表索引优化方案需要结合实际表结构评估。

 

相关阅读

标签: mysqldate函数
最新文章