Как удалить строки на основе разницы дат с MySQL?

Мне нужно удалить строки, в которых поле даты и времени старше 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

запрос


person alex    schedule 01.03.2010    source источник


Ответы (4)


Использовать:

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

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

person OMG Ponies    schedule 01.03.2010
comment
Отлично сработало - есть ли простой способ удалить строки из результата со значением 0000-00-00 00:00:00? Я имею в виду легче, чем AND reserved_datetime != '0000-00-00 00:00:00' ? - person alex; 01.03.2010
comment
Может быть, это происходит только тогда, когда я ВЫБИРАЮ. Кажется, работает нормально, когда я использую DELETE. Большое спасибо за ваш ответ! :) - person alex; 01.03.2010

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

DELETE FROM properties WHERE DATE_SUB(NOW(), INTERVAL 2 WEEK) > reserved_datetime
person Ross Snyder    schedule 01.03.2010
comment
Если вы не хотите, чтобы это было с точностью до секунды (как это сделает NOW()), вы можете заменить CURDATE(), чтобы компонента времени не было. Этот ответ мертв, хотя. - person MBCook; 01.03.2010

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

DELETE FROM properties WHERE (NOW() - reserved_datetime < interval '2 weeks')
person Mathieu    schedule 01.03.2010
comment
Не удалось заставить его работать, извините. Спасибо, что нашли время ответить. - person alex; 01.03.2010

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

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

Это предполагает, что reserved_datetime — это имя поля в таблице.

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

person wallyk    schedule 01.03.2010