2

我需要删除日期时间字段超过 2 周的行。

这就是我想出的

$duration = Date::WEEK * 2; // int(1209600)
$query = 'DELETE FROM properties
            WHERE TIMEDIFF(' . date(DATE_ISO8601) . ', reserved_datetime) > ' . $duration;

我不经常编写复杂的查询(更喜欢用 PHP 做东西,我更舒服)但我想了解更多关于它们的信息,另外在 PHP 中做这种事情效率很低,我正在处理大量的行。

有人知道我在做什么错吗?干杯。

更新

我试了一下 Wallyk 的回答,在 phpMyAdmin 中将其稍微更改为 SELECT,这样我就可以看到发生了什么。

这是我用的

SELECT *
FROM properties
WHERE date_sub( `reserved_datetime` , INTERVAL 2 week ) >0
LIMIT 0 , 30

然而,唯一的问题是它返回了reserved_datetimeis的行2010-02-28 10:45:59,肯定是不到 2 周前(从现在开始)。

我想检查 MySQL 的内部日期。我一直date(DATE_ISO8601)在我的查询中使用,因为 MySQLNOW()并不完全正确(如果感兴趣,它只是返回2010-02-28 20:09:19)。

有没有办法在该查询中指定当前日期?还有其他建议吗?

非常感谢

另一个更新

这是来自 phpMyAdmin 的屏幕截图,它可能比我的话更好地展示任何东西。哦,它只返回 3 的原因是因为所有其他人都有空白值,即0000-00-00 00:00:00

询问

4

4 回答 4

2

wallyk 的回答是不正确的。想想你在做什么——从几乎任何日期减去两周仍然会大于零(零 = 1/1/1970)。我想你想要更像这样的东西:

DELETE FROM properties WHERE DATE_SUB(NOW(), INTERVAL 2 WEEK) > reserved_datetime
于 2010-03-01T02:20:31.053 回答
1

利用:

 FROM PROPERTIES p
WHERE p.reserved_datetime <= DATE_SUB(NOW(), INTERVAL 2 WEEK)

请注意,由于使用NOW(),两周前的日期将包括时间部分。

于 2010-03-01T02:22:38.283 回答
0

我没有 mysql 数据库,所以我不能说它是否确实有效,但它在 postgresql 中有效:

DELETE FROM properties WHERE (NOW() - reserved_datetime < interval '2 weeks')
于 2010-03-01T01:48:40.163 回答
0

试试这个:

$query = 'DELETE FROM properties
         WHERE date_sub(reserved_datetime, interval 2 week) > 0';

这假定这reserved_datetime是表中的字段名称。

(使用 MySQL 5.0.46 标准测试。)

于 2010-03-01T01:48:47.787 回答