帮助编写涉及日期差异的MySQL查询

时间:2010-03-01 01:36:26

标签: php sql mysql kohana-3

我需要删除日期时间字段超过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_datetime2010-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

4 个答案:

答案 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标准测试。)