2012-11-15 14 views
11

Potrzebuję uzyskać wiersze z bazy danych, gdzie rekordy są jednego miesiąca. Próbowałem tego SELECT:SELECT wiersz według DATEPART()

$result = mysql_query("SELECT * FROM my_table WHERE DATEPART('month', date_column)=11"); 

W bazie danych jest wiele wierszy, które mają datę w 11. miesiącu, ale nie dostaję żadnych wyników. Czy ktoś może mi pomóc? Podziękować!

+1

Proszę nie używać funkcji 'mysql_ *', ponieważ są one w [procesie deprecacji] (http://news.php.net/php.internals/53799). Zamiast tego użyj [MySQLi] (http://php.net/manual/en/book.mysqli.php) lub [PDO] (http://php.net/manual/en/book.pdo.php) i [ lepszy programista PHP] (http://jason.pureconcepts.net/2012/08/better-php-developer/). –

+0

data_column type to: \t date – user1827257

+0

z nawet minimalną obsługą błędów, dowiedziałbyś się, dlaczego to nie działało: '$ result = mysql_query (...) or die (mysql_error());'. nigdy nie zakładaj, że zapytanie powiodło się. ZAWSZE sprawdź, czy nie ma błędów. –

Odpowiedz

4
SELECT * FROM my_table WHERE MONTH(date_column)=11 
+0

+1 dla 'MIESIĄC()' –

+0

Dzięki! To działa. – user1827257

2

Jeśli masz indeks na data_kolumny i obawiasz się o wydajność, lepiej NIE stosować funkcji nad kolumną. (Należy pamiętać, że to rozwiązanie, nie anwsers co dokładnie pytasz, poniewaz to dotyczy również lat)

-- For mysql specific: 
SELECT * FROM my_table 
WHERE date_column >= '2012-11-01' 
    and date_column < '2012-11-01' + INTERVAL 1 MONTH 

(mysql fiddle)

-- For tsql specific: 
SELECT * FROM my_table 
WHERE date_column >= '2012-11-01' 
    and date_column < DATEADD(month,1,'2012-11-01') 

(tsql fiddle)

0

Jeśli DATEPART nie pracuje w MySQL możesz użyć:

SELECT * FROM MyTable WHERE MONTH(joinningDate)=MONTH(NOW())-1 and YEAR(joinningDate)=YEAR(NOW()); 

Zwróci wszystkie rekordy, które wstawiono w MyTable w zeszłym miesiącu.