2016-04-07 16 views
0

kullanarak seçmek, ben garanti aramada sırasında geçerli olan bu tablodaMySQL benim proje için zaman karşılaştırma

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

satırları seçmeniz gerekir.

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

+0

WHERE garanti> CURDATE() ve Mihai

cevap

1

gibi Mihai zaten bu, aynı zamanda() veya CURTIME() o datetime ya da zaman tipi ise ŞİMDİ kullanabilirsiniz çalışması gerekir

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

söyledi

+0

Teşekkürler! Ancak, veriler geçersiz olduğunda bu geçersiz garantiyi seçmez. Bunu çözmenin en iyi yolu nedir? –

+0

Bunu WHERE garantisiyle çözdüğümü düşünüyorum <= CURDATE() VEYA garanti NULL, tekrar teşekkürler. –

+0

@NobleDinasaur Doğru, alanın NULL olmasına izin vermediğinizi varsayıyordum. OR satırınızı da eklerseniz, bunu da cevaplarıma ekleyeceğim, böylece tamamlandı – Jester

0

Böyle DATEDIFF kullanabilirsiniz: Bu demektir

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

DATEDIFF(NOW(), warranty) > 0 Eğer

Temelde böyle bir şey gerek (garanti boş ise o zaman bu satırı seçmeyin) warranty, geçerlilik tarihinden önce 'dir, dolayısıyla geçerlilik süresi dolmuştur. Bu nedenle, IF ifadesi bu durumda false değerini döndürür.

+0

Teşekkür ederiz! Ama ben WHERE IsWarrantyValid kullanamaz, sütunu kullanmanın en iyi yolu nedir? –

+0

@NobleDinasaur Gerçek gereksinimlerinizin ne olduğuna bağlıdır. Sadece geçerli garanti kayıtlarını almak mı istiyorsunuz, sadece geçerli değil mi, yoksa her ikisi de garantinin geçerli olup olmadığı bilgisi ile birlikte mi? Sorgum üçüncü adresi ele alıyor. –

+0

IsWarrantyValid kullanmayın. en iyi yol değil. MySQL'in her satır için karşılaştırma yapabilmesi için önce hesaplaması gereken bir alanda bir işlev kullanırsanız. Yani bir TAM TABLE SCAN ve bir INDEX kullanamaz ve QUERY çok yavaş olacaktır. Bu –

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