web-dev-qa-db-fra.com

Mysql DATE_SUB (MAINTENANT (), INTERVAL 1 JOUR) 24 heures ou en semaine?

J'essaie d'obtenir le nombre total d'utilisateurs enregistrés par jour. En ce moment j'utilise ceci

$sql = "SELECT name, email FROM users WHERE DATE_SUB(NOW(), INTERVAL 1 DAY) < lastModified"

mais je ne sais pas si cela fonctionne par jour ou par 24 heures?

Par exemple, un utilisateur qui s'est inscrit il y a 22 heures ne devrait pas être retourné, tout comme l'utilisateur d'aujourd'hui (= mardi)

16
alex

lastModified est, vraisemblablement, un datetime. Pour convertir cela en une date, vous pouvez simplement l'envelopper dans DATE (), c'est-à-dire DATE(lastModified). DATE() renvoie la partie date d'une valeur datetime qui est effectivement 00:00 ce jour-là.

SELECT
    name,
    email
FROM users
WHERE DATE(lastModified) = DATE( DATE_SUB( NOW() , INTERVAL 1 DAY ) )

L'utiliser pour faire correspondre un WHERE serait cependant inefficace car toutes les lignes nécessiteraient l'application de DATE et donc il analyserait probablement la table entière. Il est plus efficace de comparer lastModified aux bornes supérieure et inférieure que vous recherchez, dans ce cas> = 00:00 sur SUBDATE(NOW(),INTERVAL 1 DAY) et <00:00 sur NOW()

Par conséquent, vous pouvez utiliser BETWEEN pour faire votre choix en donnant ce qui suit.

SELECT
    name,
    email
FROM users
WHERE lastModified 
    BETWEEN DATE( DATE_SUB( NOW() , INTERVAL 1 DAY ) )
    AND DATE ( NOW() )

Je pense que tu as besoin

SELECT
    name,
    email
FROM users
WHERE DATE(lastModified) = DATE( NOW() )

Cela "arrondit uniquement à la date" et ne correspondra donc qu'aux enregistrements "depuis minuit".

9
Floris