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.

Odpowiedzi:


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

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


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


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.


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”


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;

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

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

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

-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”]


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";    
}

4
jest to bardzo powolne w porównaniu do wyboru bazy danych
IgniteCoders
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.