MySQL Виберіть дату, рівну сьогоднішній


96

Я намагаюся запустити оператор select 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це поле дати і часу
Сергій Стоцький

@Serjio Так, зараз це поле дати та часу.
Jako

що таке тип даних, signup_dateякщо він містить час, тоді ви хочете використовувати дату_формату в WHEREпункті, щоб зняти час, щоб відповідатиCURDATE()
Taryn

@bluefeet спасибі, я змінив свій сценарій. Здається, це працює, але коли результатів немає. mysql_num_rowsне відображається 0. Просто порожній.
Яко

Відповіді:


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

чи потрібно використовувати DATE () навіть у полі типу Date?
rasidnk

2
@rashidnk Ні. Хоча він не чітко сказав у питанні, поле, очевидно, типу DATETIME.
Бармар

2
Хоча це рішення абсолютно правильне, воно не масштабує добре (не може використовувати індекс на signup_date, навіть якщо такий індекс існує). Віддавайте перевагу рішення Serjio .
RandomSeed

або якщо знайти в певну дату, з індексом також використовується `` `SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') ВІД користувачів, де signup_date> = '2017-08 -30 00:00:00 'та дата реєстрації <=' 2017-08-30 23:59:59 '; ``
Суміт М Асок

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)

Прихильники цієї відповіді абсурдні. Це насправді кращий підхід, оскільки цей запит міг би використовувати індекс на signup_dateвідміну від інших підходів.
RandomSeed

2
@RandomSeed Загальна ідея тестування signup_dateвід двох разів є правильною, але час - ні. Це має бути між поточною датою 00:00та 23:59:59на неї.
Бармар,

Що ж, інтервал дат був помилявся також>. <Зрештою, не такі абсурдні.
RandomSeed

Цей запит набагато ефективніший (завдяки індексу). WHERE DATE(signup_date) = CURDATE()Взяв мій сервер ~ 50 мс, це один тут 0,8 мс.
Кай Ноак


1

Ви можете використовувати CONCATз CURDATE()до всього часу доби , а потім фільтра з використанням BETWEENв 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.