web-dev-qa-db-fra.com

Laravel Eloquent compare la date du champ datetime

Je veux obtenir toutes les lignes d'une table à travers une expression:

table.date <= 2014-07-10

Mais si la colonne contient un datetime, disons:

2014-07-10 12:00:00

Mais si je le fais: 

where('date', '<=', $date)

ça ne va pas avoir le rang.

J'imagine que c'est parce que $ date = 2014-07-10, ce qui fait supposer à MySQL qu'il s'agit du 2014-07-10 00:00:00.

Dans MySQL régulier, je voudrais juste faire

where DATE(date) <= $date

Quel serait l'équivalent en utilisant Eloquent de Laravel?

28
almo

Laravel 4+ vous propose les méthodes suivantes: whereDay(), whereMonth(), whereYear() ( # 3946 ) et whereDate() ( # 6879 ).

Ils font le travail DATE() SQL pour vous, et gèrent les différences de SQLite.

Votre résultat peut être atteint comme suit:

->whereDate('date', '<=', '2014-07-10')

Pour plus d'exemples, voir le premier message de # 3946 et ceci Article de Laravel Daily .


Update: Bien que la méthode ci-dessus soit pratique, comme l'a noté Arth, elle est inefficace sur les grands ensembles de données, car la fonction DATE() SQL doit être appliquée sur chaque enregistrement, écartant ainsi l'index possible.

Voici quelques façons de faire la comparaison (mais veuillez lire les notes ci-dessous):

->where('date', '<=', '2014-07-10 23:59:59')

->where('date', '<', '2014-07-11')

// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');

->where('date', '<', $dayAfter)

Remarques:

  • 23:59:59 est acceptable (pour le moment) à cause de la précision d'une seconde, mais jetez un coup d'œil à cet article: 23:59:59 n'est pas la fin de la journée. Pas vraiment!
  • Gardez à l'esprit le cas "date zéro" ("0000-00-00 00:00:00"). Bien que ces "dates zéro" soient à éviter, elles sont la source de tant de problèmes. Mieux vaut rendre le champ nullable si nécessaire.
45
Gras Double

Avez-vous envisagé d'utiliser:

where('date', '<', '2014-08-11')

Vous devriez éviter d'utiliser la fonction DATE() sur les colonnes indexées dans MySQL, car cela empêcherait le moteur d'utiliser l'index.

METTRE &AGRAVE; JOUR

Comme il semble y avoir un désaccord sur l’importance de DATE() et des index, j’ai créé un violon qui démontre la différence, voir POSSIBLE KEYS.

6
Arth

Vous pouvez obtenir le tout enregistrement de la date '2016-07-14' en l'utilisant

 whereDate('date','=','2016-07-14')

Ou utilisez un autre code pour la date dynamique

whereDate('date',$date)
3
Majbah Habib

Vous pouvez utiliser ceci

whereDate('date', '=', $date)

Si vous indiquez whereDate, comparez uniquement le champ date/date.

1
Jakir Hossain