Дата / время равно или больше, чем сегодня в MySQL


175

Какой лучший способ сделать следующее:

SELECT * FROM users WHERE created >= today;

Примечание: создано поле даты и времени.

Ответы:


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

Но я думаю, что вы имеете в виду created < today


11
CURDATE()вернуть только дату, а не время
Шакти Сингх

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 (), а затем сравнение с условием where.
Ропанк

Не используйте функции для столбцов, это заставляет запрос игнорировать индекс, вызывая медленные запросы. Проверьте мой ответ для альтернативного подхода stackoverflow.com/a/42365426/4311336
Bsienn

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

если столбец имеет тип datetime.


1
Я имею в виду сегодня не сейчас: D мне нужно сегодня , как 2011-03-03 14:02:02 не 2011-03-03
n00b

@ n00b: он возвращает строки больше, чем сегодня, не беспокойтесь, если время включено
Шакти Сингх

3
допустим, это 2011-02-02 14:02:02 - пользователи, созданные в 10:02:02, не будут возвращены в вашу версию, даже если они были созданы «сегодня» :)
n00b

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

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 datediff внутри оператора 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.