web-dev-qa-db-fra.com

A 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

J'espère que c'est une solution facile, mais j'essaie de filtrer les données pour les éléments suivants: -

  • Aujourd'hui
  • Hier
  • Cette semaine
  • Ce mois-ci
  • Entre deux dates.

La date que j'obtiens de la base de données est fondamentalement un horodatage.

Voici ce que j'ai essayé: -

  • Aujourd'hui

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 1 DAY)
    
  • Hier

    SELECT n.title, COUNT(*) AS times FROM node_view_count WHERE timestamp > DATE_SUB(NOW(), INTERVAL 7 DAYS)
    

...

Ça ne marche pas vraiment.

Une idée?

17
Steve

Si vous sélectionnez uniquement par date, basez vos calculs sur CURDATE (qui renvoie uniquement la date) plutôt que NOW (qui renvoie la date et l'heure). Ces exemples capturent 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-ci: WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • Entre les deux dates, le 3 juin 2013 et le 7 juin 2013 (notez comment la date de fin est spécifiée comme 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 ça. Vous pouvez utiliser la fonction DAYOFWEEK pour ajuster CURDATE() aux plages appropriées.


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

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

  • 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-ci: WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
  • Entre les deux dates, le 3 juin 2013 et le 7 juin 2013 (notez comment la date de fin est spécifiée comme le 8 juin et non le 7 juin): WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')
53
Ed Gibbs