MySQL выберите дату, равную сегодняшнему дню

99

Я пытаюсь запустить оператор выбора mysql, где он смотрит на сегодняшнюю дату и возвращает только результаты, зарегистрированные в этот текущий день. В настоящее время я пробовал следующее, но, похоже, это не работает.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

Я изменил свое SELECTутверждение на это, спасибо, ребята.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

Яко
источник
кажется, signup_dateэто поле datetime
Сергей Стоцкий 01
@Serjio Да, в настоящее время это поле даты и времени.
Jako
каков тип данных, signup_dateесли он содержит время, тогда вы захотите использовать date_format в WHEREпредложении, чтобы разделить время, чтобы оно соответствовалоCURDATE()
Тарин
@bluefeet спасибо, я изменил свой скрипт. Вроде работает, но когда результатов нет. mysql_num_rowsне отображает 0. Просто пробел.
Jako

Ответы:

203
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
источник
нужно ли использовать DATE (), даже если поле имеет тип Date?
rashidnk
2
@rashidnk Нет. Хотя он не сказал четко в вопросе, поле явно типовое DATETIME.
Barmar 07
2
Хотя это решение абсолютно правильное, оно плохо масштабируется (не может использовать индекс signup_date, даже если такой индекс существует). Предпочитаю раствор Серхио .
RandomSeed
или, если найти на конкретную дату, с индексом также используется `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') ОТ пользователей, у которых signup_date> = '2017-08 -30 00:00:00 'и signup_date <=' 2017-08-30 23:59:59 '; ``
Sumit M
3
@SumitMAsok Лучше использовать, < '2017-08-31 00:00:00'если вы используете версию MySQL с миллисекундами.
Barmar
29

Этот запрос будет использовать индекс, если он у вас есть для signup_dateполя

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)
Сергей Стоцкий
источник
1
Голоса против этого ответа абсурдны. Фактически, это предпочтительный подход, потому что этот запрос может использовать индекс signup_date, в отличие от других подходов.
RandomSeed
2
@RandomSeed Общая идея тестирования signup_dateмежду двумя значениями времени верна, но время - нет. Оно должно быть между 00:00и 23:59:59на текущую дату.
Barmar
Ну, интервал дат тоже был неправильным>. <В конце концов, голоса против были не так уж и абсурдны.
RandomSeed
Этот запрос более производительный (за счет индекса). WHERE DATE(signup_date) = CURDATE()Взял мой сервер ~ 50 мс, это один здесь 0,8 мс.
Кай Ноак,
13

Похоже, вам нужно добавить форматирование в WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

См. SQL Fiddle с демонстрацией

Тарин
источник
1

Вы можете использовать CONCATwith CURDATE()для всего времени дня, а затем отфильтровать, используя условие BETWEENin WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
Танаком Талават
источник