Как удалить строки на основе различий в датах с MySQL?

StackOverflow https://stackoverflow.com/questions/2353438

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

 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.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top