web-dev-qa-db-fra.com

comparaison de date mysql avec date_format

J'ai cherché sur Google et essayé plusieurs façons de comparer la date, mais malheureusement, le résultat n'a pas été comme prévu. J'ai l'état actuel des documents suivants:

        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                              |

Je voudrais comparer la date et donc faire comme ceci:

        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                              |

Je pense que le résultat ne devrait pas inclure "28-10-2012". Toute suggestion? Merci d'avance.

20
Doni Andri Cahyono

Votre format n’est pas fondamentalement triable - vous comparez strings, et la chaîne "28-10-2012" est supérieure à "02-11-2012".

Au lieu de cela, comparez les dates as en tant que dates, puis ne les convertissez que dans le format cible pour la sortie.

Essaye ça:

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

(L'entrée doit toujours être sous forme année-mois-valeur, conformément à la documentation .)

Notez que si starttime est un champ DATETIME, vous pouvez envisager de modifier la requête pour éviter les conversions répétées. (L’optimiseur est peut-être assez intelligent pour l’éviter, mais cela vaut la peine de vérifier.)

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

(Notez qu'il est inhabituel de formater une date avec d-m-Y pour commencer - il serait préférable d'utiliser y-M-d en général, étant la norme ISO-8601, etc. Cependant, le code ci-dessus fait ce que vous avez demandé dans la question.)

38
Jon Skeet

Utilisez 2012-11-02 au lieu de 02-11-2012 et vous n'aurez plus besoin de date_format ()

1
wormhit

Utilisez la méthode suivante:

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

Ça aidera!

0
Gaurav Gupta