2012-11-22 12 views
19

Przeszukałem i wypróbowałem kilka sposobów porównywania daty, ale niestety nie otrzymałem wyniku zgodnie z oczekiwaniami. Mam aktualny stan rejestrów jak następuje:porównanie daty mysql z datownikiem

 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        | 

Chciałbym porównać datę i dlatego zrobić tak:

 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        | 

Wierzę, że wynik nie powinien zawierać '28 -10-2012' . Jakieś sugestie? Z góry dziękuję.

Odpowiedz

37

format nie jest zasadniczo sortable jeden zacząć - jesteś porównując ciągi, a ciąg „28-10-2012” jest większa niż „02-11-2012”.

Zamiast tego powinieneś porównywać daty jako daty, a następnie konwertować je tylko do formatu docelowego dla danych wyjściowych.

Spróbuj tego:

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

(Wejście musi być zawsze w formie rok-miesiąc-wartość, jak na the documentation.)

pamiętać, że jeśli starttime jest polem DATETIME, może zostać rozważ zmianę zapytania, aby uniknąć powtórnej konwersji. (Optymalizator może okazać się na tyle, by go uniknąć inteligentny, ale warto sprawdzić.)

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

(Należy pamiętać, że jest to niczym niezwykłym, aby sformatować datę jako d-m-Y zacząć - byłoby lepiej użyć y-M-d w ogóle, będąc normą ISO-8601 itp. Powyższy kod spełnia jednak to, o co prosiłeś w pytaniu.)

+0

wielkie dzięki, właśnie tego szukam :). –

+1

@MahmoudGamal: Twoja edycja nie ma sensu. Określenie literału daty przy użyciu składni 'date '2012-11-02'' ** jest ** poprawne (w rzeczywistości jest to standard SQL do określania literałów daty). Zobacz tutaj: http://sqlfiddle.com/#!2/d41d8/4020 –

+0

@ JonSkeet: Możesz określić literał datetime, używając również literalnego standardu SQL: 'timestamp '2012-11-02 00:00:00' '(zamiast użycia" zwykłego "ciągu). –

1

Użyj 2012-11-02 zamiast 02-11-2012 i nie będziesz już potrzebować date_format()

0

Użyj następującej metody:

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 */ 

To pomoże!