MySQL日期区间查询方法及UPDATE语句日期条件故障排查
嘿,我来帮你搞定这两个MySQL相关的问题:
一、如何在MySQL中实现两个日期之间的数据查询
这里有几种常用且靠谱的方法,你可以根据场景选择:
使用
BETWEEN操作符:适合查询包含起始和结束日期的闭区间数据,语法很直观:SELECT * FROM 你的表名 WHERE 日期字段 BETWEEN '起始日期时间' AND '结束日期时间';比如你要查2018年1月1日到11日的记录,就可以写
WHERE date_col BETWEEN '2018-01-01 20:21:28' AND '2018-01-11 21:00:43',注意这个写法会包含两端的时间点。用
>=和<=显式指定区间:和BETWEEN效果完全一致,但有时候会让逻辑更清晰,尤其是当你需要调整区间边界的时候:SELECT * FROM 你的表名 WHERE 日期字段 >= '2018-01-01 20:21:28' AND 日期字段 <= '2018-01-11 21:00:43';只按日期部分查询(忽略时间):如果你只关心日期不看具体时间,可以用
DATE()函数提取日期部分,但要注意:如果你的日期字段有索引,这个写法会导致索引失效,影响查询性能。更高效的写法是直接用时间范围覆盖一整天:-- 不推荐(可能失效索引) SELECT * FROM 你的表名 WHERE DATE(日期字段) BETWEEN '2018-01-01' AND '2018-01-11'; -- 推荐(能利用索引) SELECT * FROM 你的表名 WHERE 日期字段 >= '2018-01-01' AND 日期字段 < '2018-01-12';后者的写法会包含2018-01-11这一天的所有时间(从00:00:00到23:59:59),同时能正常使用索引。
二、你的UPDATE语句无法运行的原因排查
先看你写的语句里的核心问题:你把records表中的Date字段用单引号'Date'包裹了!在MySQL里,单引号是用来表示字符串常量的,所以数据库会把'Date'当成一个普通字符串,而不是你要引用的字段。拿字符串和日期做比较,逻辑完全错误,这就是添加日期条件后语句跑不起来的原因。
修正后的语句
把单引号改成反引号(如果字段名是关键字或者有特殊字符,反引号是标准的字段名包裹方式),或者直接去掉引号(如果字段名没有空格/特殊字符):
UPDATE `players_extra` AS `e` SET `e`.`hetimostfin` = ( SELECT COUNT(`r`.`PlayerId`) FROM `records` AS `r` WHERE `r`.`PlayerId` = e.`playerID` AND `r`.`Date` BETWEEN '2018-01-01 20:21:28' AND '2018-01-11 21:00:43' );
额外优化建议
如果你的records表数据量比较大,上面的子查询写法会对players_extra的每一行都执行一次统计,性能可能不太理想。推荐用JOIN的方式重写,先批量统计符合条件的PlayerId数量,再关联更新,效率会更高:
UPDATE `players_extra` AS `e` JOIN ( SELECT `PlayerId`, COUNT(`PlayerId`) AS cnt FROM `records` WHERE `Date` BETWEEN '2018-01-01 20:21:28' AND '2018-01-11 21:00:43' GROUP BY `PlayerId` ) AS `r` ON `e`.`playerID` = `r`.`PlayerId` SET `e`.`hetimostfin` = `r`.`cnt`;
内容的提问来源于stack exchange,提问作者Joe

