J'espère que c'est une solution facile, mais j'essaie de filtrer les données pour les éléments suivants: -
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?
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:
WHERE timestamp >= CURDATE()
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND timestamp < CURDATE()
WHERE timestamp >= DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
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
:
WHERE timestamp >= UNIX_TIMESTAMP(CURDATE())
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY)) AND timestamp < UNIX_TIMESTAMP(CURDATE())
WHERE timestamp >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY))
WHERE timestamp >= UNIX_TIMESTAMP('2013-06-03') AND timestamp < UNIX_TIMESTAMP('2013-06-08')