2012-11-22 23 views
19

Randevu alıp tarihi karşılaştırmak için birkaç yol denedim ancak maalesef beklenen sonucu almadım. Aşağıdaki gibi kayıtların mevcut durumunu var:date_format ile mysql tarih karşılaştırması

 mysql> select date_format(date(starttime),'%d-%m-%Y') from data; 

       +-----------------------------------------+ 
       | date_format(date(starttime),'%d-%m-%Y') | 
       +-----------------------------------------+ 
       | 28-10-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 03-11-2012        | 
       | 03-11-2012        | 
       | 07-11-2012        | 
       | 07-11-2012        | 

Ben tarihini karşılaştırmak ve bu nedenle böyle yapmak istiyorum:

 mysql> select date_format(date(starttime),'%d-%m-%Y') from data where date_format(date(starttime),'%d-%m-%y') >= '02-11-2012'; 
       +-----------------------------------------+ 
       | date_format(date(starttime),'%d-%m-%Y') | 
       +-----------------------------------------+ 
       | 28-10-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 02-11-2012        | 
       | 03-11-2012        | 
       | 03-11-2012        | 
       | 07-11-2012        | 
       | 07-11-2012        | 

sonucun '28 içermemelidir inanıyoruz -10-2012' . Herhangi bir öneri? Şimdiden teşekkürler.

cevap

37

Kişisel biçimi temelde ile başlamak için sıralanabilir biri değil - dizeleri karşılaştıran ve dize "28-10-2012" "02-11-2012" büyüktür olduğunu ediyoruz.

Bunun yerine, tarih olarak tarihlerdeki karşılaştırarak gerektiğini ve daha sonra sadece çıkış için hedef biçime dönüştürerek.

bu deneyin:

select date_format(date(starttime),'%d-%m-%Y') from data 
where date(starttime) >= date '2012-11-02'; 

(giriş her zaman the documentation uyarınca, yıl-ay-değer biçiminde olmalıdır.) starttime bir DATETIME alan ise, isteyebileceği

Not Yinelenen dönüşümü önlemek için sorguyu değiştirmeyi düşünün. (Iyileştirici de önlemek için yeterince akıllı olabilir, ama bu araştırmaya değer.)

select date_format(date(starttime),'%d-%m-%Y') from data 
where starttime >= '2012-11-02 00:00:00'; 

(eğer başlangıçta d-m-Y olarak bir tarih biçimlendirmek alışılmadık olduğunu unutmayın - genelde y-M-d kullanmak daha iyi olurdu, ISO-8601 standardı vb. olmakla birlikte, yukarıdaki kod soru için sorduğunuz şeyi yapar.)

+0

çok teşekkürler, bu tam olarak aradığım şey :). –

+1

@MahmoudGamal: düzenlemeniz anlamlı değil. Sözdizimi 'tarih '2012-11-02' '** kullanılarak bir tarih değişkeni belirtmek ** geçerli (aslında tarih hazır bilgilerinin belirtilmesi için SQL standardıdır). Buraya bakın: http://sqlfiddle.com/#!2/d41d8/4020 –

+0

@JonSkeet: SQL standart değişkeni de kullanılarak bir datetime literal belirtebilirsiniz: 'timestamp '2012-11-02 00:00:00' '(" düz "dizgeyi kullanmak yerine). –

1

02-11-2012 yerine 2012-11-02 kullanın ve artık date_format() gerekmeyecek

0

Aşağıdaki yöntemi kullanın:

public function dateDiff ($date1, $date2) { 
/* Return the number of days between the two dates: */ 
    return round(abs(strtotime($date1)-strtotime($date2))/86400); 
} 
/* end function dateDiff */ 

Bu yardımcı olacaktır!

İlgili konular