如何实现按自然日午夜边界删除前一日的用户记录?
如何实现按自然日午夜边界删除前一日的用户记录?
我懂你的需求啦——原来的SQL是按“24小时窗口”删记录,但你想要的是按自然日的午夜边界来处理:不管用户昨天啥时候登录,只要过了昨天的午夜(也就是今天0点),就把这些记录删掉,对吧?
首先得纠正个小误区:你原来的语句DELETE FROM users WHERE DATE_SUB(CURDATE(),INTERVAL 1 DAY)>=last_login,其实是在删除last_login早于昨天0点的记录(因为CURDATE()取的是当前日期,减1天就是昨天的0点整),这和你以为的“删24小时前的记录”其实不是一回事哦。
要实现你要的效果,这里有两种常用写法:
写法一(直观易懂,适合不需要考虑索引的小表场景):
直接提取last_login的日期部分,判断它是否等于昨天的日期:DELETE FROM users WHERE DATE(last_login) = CURDATE() - INTERVAL 1 DAY这个写法逻辑直白,一眼就能看出来是要删昨天登录的所有用户记录。
写法二(性能更优,适合
last_login字段建了索引的大表场景):
用范围查询精准匹配“昨天0点到今天0点之间”的所有记录,这样能用上字段索引,避免全表扫描拖慢速度:DELETE FROM users WHERE last_login >= CURDATE() - INTERVAL 1 DAY AND last_login < CURDATE()这里
CURDATE() - INTERVAL 1 DAY就是昨天的0点整,CURDATE()是今天的0点整,这个条件刚好覆盖了昨天一整天内的所有登录记录。
如果你是想定时在午夜执行这个删除操作,用上面任意一种写法都能达到目的:不管用户昨天是凌晨1点还是晚上11点登录的,到午夜执行时都会被统一删掉。
备注:内容来源于stack exchange,提问作者WeekendCoder
相关产品推荐
相关产品推荐

