2012-10-01 15 views
49

Próbuję uruchomić instrukcję mysql select, w której wygląda ona na dzisiejszą datę i zwraca tylko wyniki zarejestrowane w tym dniu. Próbowałem obecnie następujące, ale nie wydaje się działać.MySQL Wybierz datę równą dziś

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

I zostały zmodyfikowane mój SELECT oświadczenie do tego, dzięki chłopaki.

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

+0

wydaje się, że 'signup_date' jest datetime pole – Serjio

+0

@Serjio Tak, obecnie jest to pole datetime. – Jako

+0

jaki jest typ danych 'data_u_uaktualnienia' jeśli zawiera czas, wtedy będziesz chciał użyć formatu daty w klauzuli" WHERE ", aby usunąć czas, aby dopasować' CURDATE() ' – Taryn

Odpowiedz

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

czy konieczne jest użycie DATE() nawet jeśli pole jest typu Date? – rashidnk

+1

@rashidnk Nie. Chociaż nie powiedział wyraźnie w pytaniu, pole najwyraźniej typu "DATETIME". – Barmar

+1

Chociaż to rozwiązanie jest absolutnie poprawne, to nie skaluje się dobrze (nie można użyć indeksu na 'data_u_aktualizacji', nawet jeśli taki indeks istnieje). Wolę [rozwiązanie Serjio] (http://stackoverflow.com/a/12677822/1446005). – RandomSeed

9

Brzmi jak trzeba 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

+5

pożegnaj swój występ. To zapytanie nigdy nie używa indeksu – Serjio

12

To zapytanie użyje indeksu, jeśli masz go za signup_date dziedzinie

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY) 
+0

Downvotes do tej odpowiedzi są absurdalne. Jest to w rzeczywistości preferowane podejście, ponieważ zapytanie to byłoby w stanie wykorzystać indeks w dniu "data_u_aktualizacji", w przeciwieństwie do innych podejść. – RandomSeed

+0

@RandomSeed Ogólna koncepcja testowania 'daty_urzadzenia' między dwa razy jest poprawna, ale czasy nie są. Powinien zawierać się między '00: 00' a' 23: 59: 59' na bieżącej dacie. – Barmar

+1

@Barmar Tak, masz rację. Poprawiłem odpowiedź. – RandomSeed