Как удалить строки, основанные на разнице дат с MySQL? - PullRequest
2 голосов
/ 01 марта 2010

Мне нужно удалить строки, где поле даты и времени старше 2 недель.

Это то, что я придумал

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

Я не часто пишу сложные запросы (я предпочитаю делать что-то на PHP, где мне удобнее), но я бы хотел узнать о них больше, плюс делать подобные вещи в PHP было бы очень неэффективно и Я обрабатываю большое количество строк.

Кто-нибудь знает, что я делаю не так? Приветствия.

Обновление

Я дал ответ Уоллика , немного изменив его в 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

Ответы [ 4 ]

2 голосов
/ 01 марта 2010

ответ Wallyk неверен. Подумайте о том, что вы делаете - вычитая две недели из почти любой даты, все равно будет больше нуля (ноль = 1 января 1970 года). Я думаю, вы хотите что-то еще, как это:

DELETE FROM properties WHERE DATE_SUB(NOW(), INTERVAL 2 WEEK) > reserved_datetime
1 голос
/ 01 марта 2010

Использование:

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

Помните, что из-за использования NOW() двухнедельная дата будет включать временную часть.

0 голосов
/ 01 марта 2010

Попробуйте вместо этого:

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

Предполагается, что reserved_datetime является именем поля в таблице.

(протестировано в стандарте MySQL 5.0.46.)

0 голосов
/ 01 марта 2010

У меня нет базы данных mysql, поэтому я не могу сказать, работает ли она точно, но в postgresql это так:

DELETE FROM properties WHERE (NOW() - reserved_datetime < interval '2 weeks')
...