Mysql
 sql >> Base de données >  >> RDS >> Mysql

À partir de l'horodatage en SQL, sélection des enregistrements d'aujourd'hui, d'hier, de cette semaine, de ce mois et entre deux dates php mysql

Si vous sélectionnez uniquement par date, basez vos calculs sur CURDATE (qui ne renvoie que la date) plutôt que NOW (qui renvoie la date et l'heure). Ces exemples capteront toutes les heures dans les plages de jours :

  • Aujourd'hui :WHERE timestamp >= CURDATE()
  • Hier :WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
  • Ce mois :WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Entre les deux dates du 3 juin 2013 et du 7 juin 2013 (notez que la date de fin est spécifiée comme étant le 8 juin et non le 7 juin) :WHERE timestamp >= '2013-06-03' AND timestamp < '2013-06-08'

Le "cette semaine" dépend du jour où vous commencez votre semaine ; Je vous laisse cela. Vous pouvez utiliser le DAYOFWEEK fonction pour modifier CURDATE() aux plages appropriées.

Avenant  :Le type de colonne de l'OP était INTEGER , stockant un horodatage UNIX, et ma réponse supposait que le type de colonne était TIMESTAMP . Voici comment faire toutes les mêmes choses avec une valeur d'horodatage UNIX tout en conservant l'optimisation si la colonne est indexée (comme les réponses ci-dessus le feront si le TIMESTAMP la colonne est indexée)...

Fondamentalement, la solution consiste simplement à envelopper les dates de début et/ou de fin dans le UNIX_TIMESTAMP fonction :

  • Aujourd'hui :WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
  • Hier :WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
  • Ce mois :WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Entre les deux dates du 3 juin 2013 et du 7 juin 2013 (notez que la date de fin est spécifiée comme étant le 8 juin et non le 7 juin) :WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')