如何基于时间戳分组删除MySQL表中指定10分钟范围的记录?
按10分钟时间区间分组删除MySQL记录的正确写法
你原DELETE语句的问题在于,没有对c.datestamp做和GROUP BY逻辑一致的时间戳取整处理,导致无法匹配到指定时间10分钟范围内的所有记录。
先验证要删除的记录(避免误删)
先执行SELECT语句确认目标记录:
SELECT c.* FROM commissions c LEFT JOIN comm_manuf_link ml ON c.id = ml.comm_id LEFT JOIN manuf m ON ml.manuf_id = m.id WHERE m.id = '21' AND UNIX_TIMESTAMP(c.datestamp) DIV 600 = UNIX_TIMESTAMP('2023-07-20 10:53:17') DIV 600;
正确的DELETE语句
确认无误后,执行删除操作:
DELETE c.* FROM commissions c LEFT JOIN comm_manuf_link ml ON c.id = ml.comm_id LEFT JOIN manuf m ON ml.manuf_id = m.id WHERE m.id = '21' AND UNIX_TIMESTAMP(c.datestamp) DIV 600 = UNIX_TIMESTAMP('2023-07-20 10:53:17') DIV 600;
逻辑说明
UNIX_TIMESTAMP(datetime) DIV 600会将时间转换为以10分钟(600秒)为单位的整数,同一10分钟窗口内的所有时间都会得到相同的整数值,这样就能精准匹配到和指定时间相差10分钟范围内的所有记录,和你用GROUP BY UNIX_TIMESTAMP(c.datestamp) DIV 600的分组逻辑完全一致。
如果commissions表的datestamp字段本身存储的是UNIX时间戳(而非datetime类型),可以简化为:
DELETE c.* FROM commissions c LEFT JOIN comm_manuf_link ml ON c.id = ml.comm_id LEFT JOIN manuf m ON ml.manuf_id = m.id WHERE m.id = '21' AND c.datestamp DIV 600 = UNIX_TIMESTAMP('2023-07-20 10:53:17') DIV 600;
内容的提问来源于stack exchange,提问作者RonnieT
相关产品推荐
相关产品推荐

