Как удалить строки на основе различий в датах с 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
Решение
Использовать:
FROM PROPERTIES p
WHERE p.reserved_datetime <= DATE_SUB(NOW(), INTERVAL 2 WEEK)
Имейте в виду, что из-за использования NOW()
, дата двухнедельной давности будет включать временную часть.
Другие советы
ответ валлика неверен.Подумайте о том, что вы делаете: вычитание двух недель практически из любой даты все равно будет больше нуля (ноль = 01.01.1970).Я думаю, вам нужно что-то вроде этого:
DELETE FROM properties WHERE DATE_SUB(NOW(), INTERVAL 2 WEEK) > reserved_datetime
У меня нет базы данных mysql, поэтому я не могу точно сказать, работает ли она, но в postgresql это работает:
DELETE FROM properties WHERE (NOW() - reserved_datetime < interval '2 weeks')
Вместо этого попробуйте это:
$query = 'DELETE FROM properties
WHERE date_sub(reserved_datetime, interval 2 week) > 0';
Это предполагает, что reserved_datetime
— имя поля в таблице.
(Протестировано со стандартом MySQL 5.0.46.)