2016-04-07 20 views
0

Für mein Projekt, ich brauche Zeilen aus dieser Tabelle wählenMySql wählen mit Zeitvergleich

+------------------+--------------+------+-----+---------+----------------+ 
| 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 |    | 
+------------------+--------------+------+-----+---------+----------------+ 

, wo die Garantie zum Zeitpunkt der Suche nach wie vor gültig ist. (Wenn Garantie null ist, wähle dann nicht die Zeile)

Grundsätzlich ich so etwas wie dies benötigen:

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/de/date-and-time-functions.html – Michal

+0

WHERE Garantie> CURDATE() und Mihai

Antwort

1

Wie Mihai sagte bereits

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

Dies sollte funktionieren, können Sie jetzt auch verwenden können() oder CURTIME(), wenn es Datetime ist oder eine Zeittyp

+0

Danke! Dies führt jedoch nicht zu einer ungültigen Garantie, wenn die Daten null sind. Was ist der beste Weg, dies zu beheben? –

+0

Ich denke, ich löse dies durch WHERE Garantie <= CURDATE() oder Garantie ist NULL, vielen Dank noch einmal. –

+0

@NobleDinasaur Korrekt, ich nahm an, dass Sie das Feld nicht als NULL definiert haben. Wenn Sie Ihre OR-Zeile auch hinzufügen, füge ich sie auch meiner Antwort hinzu, damit sie vollständig ist – Jester

0

Sie DATEDIFF wie diese verwenden:

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

Wenn DATEDIFF(NOW(), warranty) > 0 bedeutet dies, dass warranty ist vor aktuelles Datum, daher ist es abgelaufen. Daher gibt der Ausdruck IF in diesem Fall false zurück.

+0

Vielen Dank! Aber ich kann nicht verwenden WHERE IsWarrantyValid, was ist der beste Weg, um die Spalte zu verwenden? –

+0

@NobleDinasaur Es hängt davon ab, was Ihre tatsächliche Anforderung ist. Möchten Sie nur gültige Garantiebescheinigungen erhalten, nur nicht gültig, oder beides zusammen mit der Information, ob die Garantie gültig ist oder nicht? Meine Abfrage adressiert die dritte. –

+0

Verwenden Sie nicht IsWarrantyValid. es ist nicht der beste Weg. Wenn Sie eine Funktion für ein Feld verwenden, das in verwendet wird, wo MySQL es für jede Zeile berechnen muss, bevor es vergleichen kann. Es ist also ein FULL TABLE SCAN und kann keinen INDEX verwenden und die QUERY wird sehr langsam. Verwenden Sie EXPLAIN, um dies zu sehen –

0
if(warranty > (now()-warranty)) 
then 
select * from hardware where warranty > (now()-warranty) ; 
end if ;