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()

нужно ли использовать 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 мс.
Кай Ноак,


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'))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.