MySQL日期查询需正确使用函数和操作符,注意格式、时区及索引有效性;推荐范围查询替代函数提取,避免隐式转换与性能损耗。

MySQL 中日期查询的核心是正确使用日期函数和比较操作符,关键在于理解日期格式、时区影响以及索引是否生效。
基础日期比较:直接用 WHERE 配合日期字面量
最常用的方式是用 =、>、 等操作符直接比对日期字段。注意日期字符串必须符合标准格式('YYYY-MM-DD' 或 'YYYY-MM-DD HH:MM:SS'),否则可能隐式转换失败或结果异常。
-
查某一天的数据:
SELECT * FROM orders WHERE DATE(create_time) = '2024-05-20';(推荐用DATE()提取日期部分,避免忽略时间) -
查某个时间段:
SELECT * FROM logs WHERE event_time BETWEEN '2024-01-01' AND '2024-01-31 23:59:59'; -
避免写成:
WHERE create_time LIKE '2024-05-20%'——这会绕过索引,性能差
按年月日动态提取:用 YEAR() / MONTH() / DAY() 等函数
适合做分组统计或条件筛选,但要注意:对字段使用函数(如 YEAR(create_time))通常会导致该字段无法走索引,大数据量时慎用。
-
查2024年所有订单:
SELECT * FROM orders WHERE YEAR(create_time) = 2024; -
更高效写法(可走索引):
WHERE create_time >= '2024-01-01' AND create_time -
按月份汇总:
SELECT YEAR(create_time), MONTH(create_time), COUNT(*) FROM sales GROUP BY 1, 2;
相对日期查询:用 DATE_SUB()、NOW()、CURDATE() 灵活计算
适用于“最近7天”、“上个月”、“本周一”等业务场景,语义清晰且便于维护。
-
最近30天的记录:
SELECT * FROM user_login WHERE login_time >= DATE_SUB(NOW(), INTERVAL 30 DAY); -
昨天的数据:
WHERE DATE(login_time) = DATE_SUB(CURDATE(), INTERVAL 1 DAY); -
本月第一天到今天:
WHERE login_time >= DATE_FORMAT(NOW(), '%Y-%m-01');
注意事项与优化建议
日期查询容易踩坑,尤其在性能和时区方面。
-
字段类型要匹配:日期字段尽量用
DATE、DATETIME或TIMESTAMP,别用VARCHAR存日期字符串 -
注意时区:
NOW()和CURTIME()返回服务器时区时间;跨时区应用建议统一存 UTC,查询时再转换 -
索引有效性:对
create_time建了索引,但写成WHERE DATE(create_time) = '2024-05-20'就用不上索引;改用范围查询更稳妥 -
NULL 值处理:如果日期字段允许 NULL,记得加
IS NOT NULL判断,避免意外遗漏










