2012-03-18 3 views
0

В MYSQL у меня есть «0», вставленный в поле DATETIME, называемое DT. делает его «0000-00-00 00:00:00». Мне нужно сравнить DT с NOW() и сказать, был ли результат в прошлом или нет.Что такое ДЕЙСТВИТЕЛЬНО внутри этого поля?

Некоторые даты имеют реальные значения, а некоторые даты имеют значение «0» (как сказано, «0000-00-00 00:00:00»). Как я могу проверить, что столбец DT + INTERVAL 3 MONTH < NOW()?

Спасибо!

ответ

1

Это кажется, что вы просто хочу, чтобы игнорировать 0 даты, так что вы можете просто отфильтровать 0 даты в вашей статье WHERE так:

SELECT * FROM mytable 
WHERE DT != '0000-00-00 00:00:00' 
    AND DATE_ADD(DT, INTERVAL 3 MONTH) < NOW() 

Вот оптимизированная версия этого запроса. Вы должны попытаться поставить свои функции на правильную сторону критериев, чтобы MySQL мог использовать индексы:

SELECT * FROM mytable 
WHERE DT != '0000-00-00 00:00:00' 
    AND DT < DATE_ADD(NOW(), INTERVAL -3 MONTH) 
+0

Имейте в виду, что любой запрос sql-запроса, содержащий NOW(), не может быть кэширован в кеше запросов. Лучше использовать некоторое реальное значение даты и времени, переданное из скрипта. –

+0

@FractalizeR, спасибо за ввод. Мы действительно хотим, чтобы запросы с помощью NOW() были кешированы, потому что на секунду это только NOW()? – Ami

+0

хорошо, это зависит от того, насколько занят ваш сайт. Вы можете округлить NOW() в своем скрипте до ближайших 5 минут, например, чтобы воспользоваться кешированием запросов в MySQL. Но у вас есть возможность реализовать это в логике сценария. Во всяком случае, это было всего лишь уведомление, а не критика. –

0

Вы можете использовать функцию DATE_ADD(), чтобы получить то, что вы ищете:

SELECT * FROM mytable WHERE DATE_ADD(`DT`, INTERVAL 3 MONTH) < NOW(); 

Это возвращает все столбцы, где (DT + ИНТЕРВАЛ 3 МЕСЯЦА) < NOW()

+0

Это не работает! Я не получаю все 0 дат – Ted

+0

@Ted Что вы получаете? –

+0

@Ted Попробуйте выбрать 'NOW()', чтобы вы могли разницу между ними. –

Смежные вопросы