Tek bir sorgu kullanarak tarihe göre bir mysql tablo filtrelemek için çalışıyoruz

4 Cevap php

I'm trying to request any records from a table that appear on or after today's date, using a single query.
All the dates for each record are stored in separate columns e.g.. - one for month, one for year, and one for day.

Açıkçası ben bugünün tarihini bir yıl sonra ortaya çıkan tüm kayıtları alıyorum oldum

$sql = "SELECT * FROM table WHERE year>=".$year_today." 
       ORDER BY year, month, day";

Sonra kullanarak, biraz aşağı süzmek çalışıyorum:

$sql = "SELECT * FROM table 
        WHERE year>=".$year_today." && month>=".$month_today." 
              && day>=".$day_today." 
        ORDER BY year, month, day";

Ve bunu test etmek için, i yesterdays tarih, henüz bu rekor hala döndürülen kayıtların listede görünen ile veritabanında bir rekor oluşturdu. Ben yanlış ne yapıyorum? (

4 Cevap

Eğer kullanmak eğer ben bilmiyorum "&&" yerine "VE" senin bağlamında - belki kullanmak için SQL değiştirmeyi deneyin

" AND month>=".$month_today." AND day>=".$day_today."

EDIT :

sql doğru bir kod olabilir davranmaya yapmak için Nick'in cevap, bir uzantısı olarak:

$sql = "SELECT * FROM table WHERE (  
(year>".$year_today.")
OR (year=".$year_today." && month>".$month_today." )
OR (year=".$year_today." && month=".$month_today."&& day>=".$day_today.")
)
 ORDER BY year, month, day";

... Ama bu tarihlere dönüştürme ve tarih karşılaştırma kullanarak daha bir sürü Messier almaya başlıyor

EDIT2:

Bu sütunlar endeksli eğer ama sonra tekrar, indeksler kullanılmış olabilir. Tarihleri ​​dönüşüm kullanarak performans tamamen kabul eğer hala bu şekilde kod SQL için çok daha fazla çaba var.

Bir TARİH sütunu kullanarak daha iyi iken Bu, güzel bir şekilde zaman fonksiyonları kullanılarak elde edilebilir.

SELECT * FROM TABLE WHERE TIMESTAMP(CONCAT(year,"-",month,"-",day)) >= CURDATE()

bu bir dizin kullanmak değildir Tamam, kötü ha ... doğru şey bir TARIHI sütun olurdu, ama elden tüm bu can sıkıcı yapıyor asyou da bu yıl büyük ama ay küçük ve malzeme olduğu durum dikkate almak zorunda olduğunu .. ..

Tarihleri ​​ile tarihlerini karşılaştırmak için:

SELECT * FROM table WHERE 
  STR_TO_DATE(
    CONCAT(year
    , '-'
    , right(concat('00', month), 2)
    , '-'
    , right(concat('00', day), 2))
  , '%Y-%m-%d')

>= STR_TO_DATE('2009-12-11', '%Y-%m-%d')

Bir tarih bu sorgu başarısız olur başka tarihinden sonra olup olmadığını kontrol etmek için:

$sql = "SELECT * FROM table WHERE year>=".$year_today." && month>=".$month_today." && day>=".$day_today." ORDER BY year, month, day";

februari günü 12 Mart februari günde 15 daha küçük olduğunu, ancak farklı bir ay içinde, çünkü ondan sonra hala ....