如何在mysql中进行日期查询_mysql日期查询语句讲解

来源:这里教程网 时间:2026-02-28 20:48:01 作者:

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
判断,避免意外遗漏

相关推荐