2012-11-22 4 views
19

Ho cercato su Google e provato diversi modi per confrontare la data, ma sfortunatamente non ho ottenuto il risultato come previsto. Ho stato attuale di record come segue:confronto data mysql con date_format

 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        | 

Vorrei confrontare la data e quindi fare in questo modo:

 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        | 

credo che il risultato non dovrebbe includere '28 -10-2012' . Qualche suggerimento? Grazie in anticipo.

risposta

37

vostro formato non è fondamentalmente uno ordinabile per cominciare - si sta confrontando stringhe , e la stringa "28-10-2012" è maggiore di "2012/02/11".

Invece, è necessario confrontare le date come date e quindi convertirle nel formato di destinazione per l'output.

Prova questo:

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

(L'ingresso deve essere sempre in forma-month-valore di anno, come da the documentation.)

Nota che se starttime è un campo DATETIME, si potrebbe desiderare di considera la modifica della query per evitare la conversione ripetuta. (L'ottimizzatore potrebbe essere sufficiente per evitare che intelligente, ma vale la pena controllare.)

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

(Si noti che è insolito per formattare una data come d-m-Y per cominciare - sarebbe meglio usare y-M-d in generale, essendo lo standard ISO-8601 ecc. Tuttavia, il codice sopra riportato fa quello che hai chiesto nella domanda.)

+0

molte grazie, questo è esattamente quello che sto cercando :). –

+1

@MahmoudGamal: la tua modifica non ha senso. La specifica di un valore letterale della data utilizzando la sintassi 'date '2012-11-02'' ** è ** valida (in effetti è lo standard SQL per specificare i valori letterali delle date). Vedi qui: http://sqlfiddle.com/#!2/d41d8/4020 –

+0

@JonSkeet: è possibile specificare un valore letterale di tipo datetime utilizzando anche il letterale standard SQL: 'timestamp '2012-11-02 00:00:00' '(invece di usare una stringa" semplice "). –

1

Usa 2012-11-02 anziché 02-11-2012 e non avrai più bisogno di date_format()

0

Utilizzare il seguente metodo:

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

Sarà d'aiuto!