2016-04-07 2 views
0

Для моего проекта, мне нужно выбрать строки из этой таблицыMySql выбрать путем сравнения времени

+------------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+------------------+--------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| hardware_type_id | int(11)  | NO | MUL | NULL |    | 
| make_type_id  | int(11)  | NO | MUL | NULL |    | 
| year    | int(11)  | YES |  | NULL |    | 
| model   | varchar(255) | YES |  | NULL |    | 
| name    | varchar(255) | NO |  | NULL |    | 
| warranty   | date   | YES |  | NULL |    | 
+------------------+--------------+------+-----+---------+----------------+ 

где гарантия остается в силе в момент поиска. (Если гарантия имеет нулевое значение, то не выбрать эту строку)

В принципе мне нужно что-то вроде этого:

SELECT * FROM hardware WHERE ({now} - warranty) <0; // valid warranty 
SELECT * FROM hardware WHERE ({now} - warranty) >0; // invalid warranty 
+0

https: //dev.mysql .com/doc/refman/5.5/ru/date-and-time-functions.html – Michal

+0

ГДЕ гарантия> CURDATE() и <для другого варианта – Mihai

ответ

1

Как Михай уже сказал

SELECT * FROM hardware WHERE warranty <= CURDATE(); // valid warranty 
SELECT * FROM hardware WHERE warranty > CURDATE() OR warranty IS NULL; // invalid warranty 

Это должно работать, вы можете также использовать NOW() или CURTIME(), если это DateTime или тип времени

+0

Спасибо! Но это не отображает недействительную гарантию, когда данные являются нулевыми, каков наилучший способ решить эту проблему? –

+0

Я думаю, что я разрешаю эту гарантию WHERE <= CURDATE() ИЛИ ГАРАНТИЯ НЕТ, еще раз спасибо. –

+0

@NobleDinasaur Правильно, я предполагал, что вы не допустили, чтобы поле было NULL. Если вы добавите свою линию OR, я добавлю ее в свой ответ, чтобы она была завершена – Jester

0

Вы можете использовать DATEDIFF так:

SELECT *, 
     IF(DATEDIFF(NOW(), warranty) > 0, false, true) AS IsWarrantyValid 
FROM hardware 

Если DATEDIFF(NOW(), warranty) > 0 это означает, что warranty - до текущая дата, отсюда истекло. Таким образом, выражение IF возвращает false в этом случае.

+0

Спасибо! Но я не могу использовать ГДЕ IsWarrantyValid, что лучший способ использовать столбец? –

+0

@NobleDinasaur Это зависит от вашего фактического требования. Вы хотите получить только действительные гарантийные записи, только недействительными или, возможно, оба вместе с информацией о том, действительна ли гарантия или нет? Мой запрос относится к третьему. –

+0

Не используйте IsWarrantyValid. это не лучший способ. если вы используете функцию в поле, которое используется, когда MySQL должен вычислять его для каждой строки, прежде чем он сможет сравнить. Таким образом, это ПОЛНЫЙ ТАБЛИЦЫ СКАНИРОВАНИЯ и не может использовать ИНДЕКС, и QUERY будет очень медленным. используйте EXPLAIN, чтобы увидеть это –

0
if(warranty > (now()-warranty)) 
then 
select * from hardware where warranty > (now()-warranty) ; 
end if ; 
Смежные вопросы