我需要删除日期时间字段超过2周的行。
这就是我想出来的
$duration = Date::WEEK * 2; // int(1209600)
$query = 'DELETE FROM properties
WHERE TIMEDIFF(' . date(DATE_ISO8601) . ', reserved_datetime) > ' . $duration;
我不经常编写复杂的查询(更喜欢在PHP中做一些我觉得更舒服的东西)但是我想了解更多关于它们的信息,而且在PHP中做这种事情会非常低效,我正在处理大量的行。
任何人都知道我做错了什么?欢呼声。
我给了Wallyk's answer一个镜头,在phpMyAdmin中将它略微改为SELECT,这样我才能看到发生了什么。
这是我用的
SELECT *
FROM properties
WHERE date_sub( `reserved_datetime` , INTERVAL 2 week ) >0
LIMIT 0 , 30
唯一的问题是,它返回了reserved_datetime
为2010-02-28 10:45:59
的行,绝对不到2周(从现在开始)。
我想过检查MySQL的内部日期。我一直在我的查询中使用date(DATE_ISO8601)
,因为MySQL的NOW()
并不完全正确(如果感兴趣2010-02-28 20:09:19
,它就会返回)。
有没有办法在该查询中指定当前日期?还有其他建议吗?
非常感谢
这是phpMyAdmin的截图,它可以展示比我的话更好的东西。哦,它返回3的原因仅仅是因为所有其他人都有空值,即0000-00-00 00:00:00
query http://alexanderdickson.com/hosted/stackoverflow.com/datetime-query.png
答案 0 :(得分:2)
wallyk的回答是不正确的。想想你正在做什么 - 从几乎任何日期减去两周仍将大于零(零= 1/1/1970)。我想你想要更像这样的东西:
DELETE FROM properties WHERE DATE_SUB(NOW(), INTERVAL 2 WEEK) > reserved_datetime
答案 1 :(得分:1)
使用:
FROM PROPERTIES p
WHERE p.reserved_datetime <= DATE_SUB(NOW(), INTERVAL 2 WEEK)
请注意,由于使用NOW()
,两周的日期将包含时间部分。
答案 2 :(得分:0)
我没有mysql数据库所以我不能说它是否可以肯定,但它在postgresql中有效:
DELETE FROM properties WHERE (NOW() - reserved_datetime < interval '2 weeks')
答案 3 :(得分:0)
请改为尝试:
$query = 'DELETE FROM properties
WHERE date_sub(reserved_datetime, interval 2 week) > 0';
这假设reserved_datetime
是表格中的字段名称。
(使用MySQL 5.0.46标准测试。)