Datetime równe lub większe niż obecnie w MySQL

175

Jaki jest najlepszy sposób na wykonanie następujących czynności:

SELECT * FROM users WHERE created >= today;

Uwaga: utworzone jest polem typu data i godzina.

n00b
źródło

Odpowiedzi:

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

Ale myślę, że masz na myśli created < today

Clodoaldo Neto
źródło
11
CURDATE()powrót tylko data, a nie czas
Shakti Singh
20
@ n00b jak masz użytkowników, którzy zostaną utworzeni w przyszłości ..? interesujące =) Używałem tego, aby sprawdzić, czy post już wygasł.
Garet Claborn
75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

Czytaj więcej: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html

Edmhs
źródło
6
Może czegoś mi brakuje, ale w przypadku typów DATETIME rozwiązanie CURDATE () nie działa. To robi.
Jahmic
ponadto zajmuje to dużo czasu, ponieważ konwertowanie DATETIME do daty za pomocą funkcji DATE (), a następnie porównywanie z warunkiem where jest narzutem.
roopunk
Nie używaj funkcji na kolumnach, powoduje to, że zapytanie ignoruje indeks, powodując powolne zapytania. Sprawdź moją odpowiedź na alternatywne podejście stackoverflow.com/a/42365426/4311336
Bsienn
33
SELECT * FROM users WHERE created >= NOW();

jeśli kolumna jest typu datetime.

Shakti Singh
źródło
1
to znaczy dzisiaj nie teraz: D potrzebuję dzisiaj jak 2011-03-03 nie 2011-03-03 14:02:02
n00b
@ n00b: to będzie zwraca wiersze większe niż dzisiaj nie martw się, jeśli czas jest włączone
Shakti Singh
3
powiedzmy to 2011-02-02 14:02:02 - użytkowników, które zostały utworzone w 10:02:02 nie zostaną zwrócone w wersji nawet jakby były stworzone „dzisiaj” :)
n00b
@ n00b: Lol ya, żaden użytkownik nie zostałby nigdy zwrócony, gdybyśmy tylko mogli zatrzymać czas.
Mike Purcell
15

Jeśli „utworzono” to data i godzina

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

CURDATE () oznacza również „2013-05-09 00:00:00”

Bart
źródło
Dzięki za to. Właściwie potrzebowałem DATE_SUB (używanego w ten sam sposób), ale to postawiło mnie na właściwej ścieżce.
Daniel Price
To nie zwróci danych, w których data zawiera 0s w czasie, tj. „2013-05-09 00:00:00” zostanie pominięty
Bsienn
8

Zaznaczona odpowiedź jest myląca. Postawione pytanie brzmi DateTime, ale stwierdzone, co było potrzebne, było sprawiedliwe CURDATE().

Najkrótsza i prawidłowa odpowiedź na to jest:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;
JeffMan
źródło
5

Jeśli kolumna ma indeks, a do kolumny zostanie zastosowana funkcja, indeks nie działa i następuje pełne skanowanie tabeli, co powoduje naprawdę powolne zapytanie.

Aby korzystać z indeksu i porównać datetime z dzisiejszej / bieżącej daty, co następuje mogą być użyte.

Rozwiązanie dla OP:

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

Próbka do pobrania danych na dziś:

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

Lub użyj skrótu BETWEEN

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')
Bsienn
źródło
2
SELECT * FROM users WHERE created >= now()
Silx
źródło
To nie zwróci rekordów przed tą chwilą od dzisiaj.
gsziszi
0

Poniższy kod zadziałał dla mnie.

declare @Today date

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

Select *

FROM table_name
WHERE created <= @Today
Rob Fahndrich
źródło
-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”]

vpgodara
źródło
To bardzo surowe rozwiązanie
IgniteCoders
-5

możesz zwrócić wszystkie wiersze, a następnie użyć funkcji php datediff wewnątrz instrukcji if, chociaż spowoduje to dodatkowe obciążenie serwera.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}
Koney L Visinko
źródło
4
jest to bardzo powolne w porównaniu do wyboru bazy danych
IgniteCoders