Mysql DATE_SUB (NOW(), INTERVAL 1 DAY) 24 часа или будний день?

Я пытаюсь получить тотальное количество зарегистрированных пользователей в день. В данный момент я использую этот

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

но я не уверен, что это работает в день или в течение 24 часов?

Например, пользователь, зарегистрировавшийся 22 часа назад, не должен быть возвращен мне точно так же, как сегодня пользователь (= вторник)

Ответ 1

lastModified - предположительно, дата и время. Чтобы преобразовать это в дату, вы можете просто обернуть его в DATE(), т.е. DATE(lastModified). DATE() возвращает часть даты значения datetime, которое в этот день эффективно 00:00.

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

Использование этого для соответствия WHERE, хотя и было бы неэффективным, поскольку для всех строк потребуется DATE, применяемая к ним, и поэтому он, вероятно, сканирует всю таблицу. Эффективнее сравнить lastModified с верхней и нижней границами, которые вы ищете, в этом случае >= 00:00 на SUBDATE(NOW(),INTERVAL 1 DAY) и < 00:00 на NOW()

Поэтому вы можете использовать BETWEEN, чтобы сделать ваш выбор, давая следующее.

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

Ответ 2

Думаю, вам нужно

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

Это эффективно "округляется до даты только" и поэтому будет соответствовать только записи "с полуночи".