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/ja/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()、それは、日時や時間タイプ

+0

ありがとうございました!しかし、これは、データがnullのときに無効な保証を選択しません、これを解決する最良の方法は何ですか? –

+0

私はこれをどこの保証<= CURDATE()または保証がNULLで解決すると思います、もう一度ありがとうございます。 –

+0

@NobleDinasaur正しいですが、私はフィールドがNULLであることを許可していないと仮定していました。 ORラインを追加しても、私の答えにも追加されますので、完成しました。 – Jester

0

あなたはこのようDATEDIFFを使用することができます:これはことを意味

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

DATEDIFF(NOW(), warranty) > 0場合

は基本的に私はこのようなものが必要(保証がnullの場合は、その行を選択しないでください) warrantyの前に現在の日付であるです。したがって、期限切れです。したがって、この場合、IF式はfalseを返します。

+0

ありがとうございました!しかし、私は使用することはできません どこIsWarrantyValid、列を使用する最良の方法は何ですか? –

+0

@NobleDinasaurそれはあなたの実際の必要条件によって異なります。有効な保証記録のみを取得するか、有効でないか、または両方の情報と共に保証が有効かどうかを確認しますか?私の質問は3番目に言及します。 –

+0

IsWarrantyValidは使用しないでください。それは最善の方法ではありません。あなたが比較できるようになる前に、MySQLが各行に対してそれを計算しなければならない場所で使用されるフィールドで関数を使用する場合。したがって、それはFULL TABLE SCANであり、INDEXを使用することはできません。QUERYは非常に遅くなります。これを見るにはEXPLAINを使用してください –

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