如何在WHERE子句中为Unix时间戳添加天数?删除数据遇SQL异常
搞定删除过期条目SQL的正确姿势
我来帮你梳理下问题所在,然后给出正确的写法:
首先你之前的语句有两个明显问题:
expire + 30是给时间戳加了30秒,完全不是你要的30天- 逻辑搞反了:你要找的是「expire距离当前日期30天及以上」的条目,也就是expire的时间要早于等于30天前的当前时间,而不是加30天之后和现在比
情况1:expire是UNIX时间戳(秒级数值)
如果你的expire字段存的是UNIX时间戳,直接用数值计算就行,30天等于 30*24*3600 秒,正确的DELETE语句:
DELETE FROM share WHERE active = false AND expire <= UNIX_TIMESTAMP() - (30 * 24 * 3600);
情况2:expire是DATETIME/TIMESTAMP日期类型
如果expire是标准的日期时间类型,用DATE_SUB函数更直观:
DELETE FROM share WHERE active = false AND expire <= DATE_SUB(NOW(), INTERVAL 30 DAY);
关于TIMESTAMPADD无法使用的问题
如果是MySQL环境,TIMESTAMPADD的正确用法是指定时间单位,比如这样写也能实现需求:
DELETE FROM share WHERE active = false AND expire <= TIMESTAMPADD(DAY, -30, NOW());
要是这个函数报错,大概率是数据库版本太低,或者你用的不是MySQL(比如SQLite要用DATE(NOW(), '-30 days')替代)。
内容的提问来源于stack exchange,提问作者Lars Kakavandi-Nielsen
相关产品推荐
相关产品推荐

