web-dev-qa-db-ja.com

Mysql DATE_SUB(NOW()、INTERVAL 1 DAY)24時間または平日?

1日あたりの登録ユーザーの総量を取得しようとしています。現時点では私はこれを使用しています

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

しかし、これが1日ごとに機能するのか24時間ごとに機能するのかわかりませんか?

たとえば、22時間前に登録したユーザーは、今日のユーザー(=火曜日)のように返されるべきではありません。

16
alex

lastModifiedは、おそらく日時です。これを日付に変換するには、DATE()、つまりDATE(lastModified)でラップするだけです。 DATE()は、実際にはその日の00:00である日時値の日付部分を返します。

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

これを使用してWHEREに一致させると、すべての行にDATEを適用する必要があり、おそらくテーブル全体をスキャンするため、非効率的です。 lastModifiedを探している上限および下限と比較する方が効率的です。この場合、SUBDATE(NOW(),INTERVAL 1 DAY)で> = 00:00、NOW()で<00:00

したがって、BETWEENを使用して、以下を選択して選択できます。

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

必要だと思う

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

これは事実上「日付のみに丸める」ため、「真夜中以降」のレコードにのみ一致します。

9
Floris