Час, рівний або більший, ніж сьогодні, у MySQL


175

Що найкраще зробити наступним чином:

SELECT * FROM users WHERE created >= today;

Примітка: створено поле для дати.

Відповіді:


329
SELECT * FROM users WHERE created >= CURDATE();

Але я думаю, ти маєш на увазі created < today


11
CURDATE()повернути лише дату не час
Shakti Singh

20
@ n00b як у вас є користувачів, які створюються в майбутньому ..? Цікаво =) Я використовував це, щоб побачити, чи закінчилася публікація ще.
Гарет Клаборн

75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

Детальніше: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html


6
Можливо, мені чогось не вистачає, але з типами DATETIME рішення CURDATE () не працює. Це робить.
Джаміч

плюс це займає багато часу, оскільки виникають накладні перетворення DATETIME на дату за допомогою функції DATE (), а потім порівняння з умовою, де.
roopunk

Не використовуйте функції на стовпцях, це змушує запит ігнорувати індекс, викликаючи повільні запити. Перевірте свою відповідь на альтернативний підхід stackoverflow.com/a/42365426/4311336
Bsienn

33
SELECT * FROM users WHERE created >= NOW();

якщо стовпець - тип дати


1
я маю на увазі сьогодні не зараз: D мені потрібно сьогодні, як 2011-03-03 не 2011-03-03
14:02:02

@ n00b: вона поверне рядки більше, ніж сьогодні, не хвилюйтесь, якщо час буде включено
Shakti Singh

3
скажемо, що це 2011-02-02 14:02:02 - користувачі, створені о 10:02:02, не вернуться у вашій версії, хоча вони були створені "сьогодні" :)
n00b

@ n00b: Lol ya, жоден користувач ніколи не повернеться, якби ми могли зупинити час.
Майк Перселл

15

Якщо "створено", це тип дати

SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

CURDATE () означає також "2013-05-09 00:00:00"


Дякую за це Мені насправді потрібен був DATE_SUB (використовується таким же чином), але це поставило мене на правильний шлях.
Даніель Прайс

Це не поверне дані, коли дата містить 0s в часі, тобто '2013-05-09 00:00:00' буде пропущено
Bsienn

8

Відповідь, позначена помилковим. Поставлене запитання є DateTime, але зазначено, що було потрібно CURDATE().

Короткий і правильну відповідь на це:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;

5

Якщо у стовпці є індекс і на стовпчик застосовується функція, то індекс не працює і відбувається сканування повної таблиці, викликаючи дуже повільний запит.

Для того, щоб використовувати індекс і порівняти дати і час з сьогодні / поточною датою, то можна використовувати наступний.

Рішення для ОП:

select * from users
where created > CONCAT(CURDATE(), ' 23:59:59')

Зразок для отримання даних на сьогодні:

select * from users
where 
    created >= CONCAT(CURDATE(), ' 00:00:00') AND
    created <= CONCAT(CURDATE(), ' 23:59:59')

Або використовувати МЕЖДУ коротко

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')

2
SELECT * FROM users WHERE created >= now()

Це не поверне записи раніше, ніж цей момент.
gsziszi

0

Наведений нижче код працював для мене.

declare @Today date

Set @Today=getdate() --date will equal today    

Select *

FROM table_name
WHERE created <= @Today

-1
SELECT * FROM table_name WHERE CONCAT( SUBSTRING(json_date, 11, 4 ) ,  '-', SUBSTRING( json_date, 7, 2 ) ,  '-', SUBSTRING(json_date, 3, 2 ) ) >= NOW();

json_date ["05/11/2011"]


Це дуже сире рішення
IgniteCoders

-5

Ви можете повернути всі рядки та використовувати функцію php dateiff всередині оператора if, хоча це призведе до додаткового навантаження на сервер.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}

4
це дуже повільно порівняно з вибором бази даних
IgniteCoders
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.