MySQL Wybierz datę równą dzisiejszej

99

Próbuję uruchomić instrukcję mysql select, która wygląda na dzisiejszą datę i zwraca tylko wyniki zarejestrowane w tym dniu. Obecnie próbowałem następujących rozwiązań, ale wydaje się, że nie działają.

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

Zmodyfikowałem moje SELECToświadczenie, dzięki chłopaki.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

Jako
źródło
wygląda na to, że signup_datejest to pole datetime
Sergii Stotskyi
@Serjio Tak, obecnie jest to pole z datą i godziną.
Jako
jaki jest typ danych, signup_datejeśli zawiera czas, wtedy będziesz chciał użyć formatu date_format w WHEREklauzuli, aby usunąć czas, aby dopasowaćCURDATE()
Taryn
@bluefeet dzięki, zmodyfikowałem mój skrypt. Wydaje się, że działa, ale gdy nie ma wyników. mysql_num_rowsnie wyświetla 0. Tylko puste miejsce.
Jako

Odpowiedzi:

203
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
źródło
czy konieczne jest użycie DATE () nawet jeśli pole jest typu Date?
rashidnk
2
@rashidnk Nie. Chociaż nie powiedział wyraźnie w pytaniu, pole jest najwyraźniej typowe DATETIME.
Barmar
2
Chociaż to rozwiązanie jest absolutnie poprawne, nie skaluje się dobrze (nie można używać indeksu signup_date, nawet jeśli taki indeks istnieje). Wolę rozwiązanie Serjio .
RandomSeed
lub jeśli znaleźć w określonym dniu, przy użyciu indeksu również `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM users where signup_date> = '2017-08 -30 00:00:00 'i signup_date <=' 2017-08-30 23:59:59 '; ``
Sumit M Asok
3
@SumitMAsok Lepszy w użyciu, < '2017-08-31 00:00:00'jeśli używasz wersji MySQL z milisekundami.
Barmar
30

To zapytanie użyje indeksu, jeśli masz go dla signup_datepola

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)
Sergii Stocki
źródło
1
Głosy przeciw tej odpowiedzi są absurdalne. W rzeczywistości jest to preferowane podejście, ponieważ to zapytanie będzie w stanie wykorzystać indeks signup_date, w przeciwieństwie do innych podejść.
RandomSeed
2
@RandomSeed Ogólna idea testowania signup_datemiędzy dwoma czasami jest poprawna, ale czasy nie. Powinien przypadać pomiędzy 00:00i 23:59:59w bieżącym dniu.
Barmar
Cóż, przedział dat też był zły>. <W końcu głosy przeciwne nie były aż tak absurdalne.
RandomSeed,
To zapytanie jest o wiele bardziej wydajne (ze względu na indeks). WHERE DATE(signup_date) = CURDATE()Wziął mój serwer ~ 50 ms, ten tutaj 0,8 ms.
Kai Noack
13

Wygląda na to, że musisz dodać formatowanie do WHERE:

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

Zobacz SQL Fiddle with Demo

Taryn
źródło
1

Można użyć CONCATw CURDATE()celu cały czas dnia, a następnie filtrować według używając BETWEENw WHEREstanie:

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'))
Tanakom Talawat
źródło