2013-05-20 10 views
8

Mam tabelę Mysql, która jest używana do pliku dziennika na tej tabeli znajduje się pole o nazwie "log_date" I przechowuje datę w następującym formacie (% Y-% m-% d % H:% i.% S). W DB daty wyglądają jak te 2013-20-05 00: 00.00. Powiedzmy, że dzisiejsza data to 2013-20-05 I mam pliki dziennika od 2013-01-01 do dnia dzisiejszego. Jeśli uruchomić zapytanie tak:Filtruj według datetime Formatowanie MYSQL

SELECT * FROM log_table 
WHERE STR_TO_DATE(log_date, '%Y-%m-%d %H:%i.%s') < '2013-05-05 00:00.00' 

ten powraca każdego wiersza w PB tym rzędach, które są większe niż 2013-05-05 00: 00.00

Jeśli odwrócić < (poniżej) do a (więcej) z zapytaniem, które wygląda tak:

SELECT * FROM log_table 
WHERE STR_TO_DATE(log_date, '%Y-%m-%d %H:%i.%s') > '2013-05-05 00:00.00' 

Następnie zwraca wiersze ZERO. Myślę, że znacznik czasu jest przyczyną problemu, nad którym pracowałem wcześniej, ale nie w formacie DateTime. Dlaczego to się dzieje?

+0

Jaki jest typ danych dla 'log_date'? – Kermit

Odpowiedz

14

log_date powinno być typu danych DateTime. Znacznie prostsze jest korzystanie z funkcji MySQL DATE. Niektóre przykłady

SELECT * FROM log_table 
WHERE DATE(log_date) < '2013-05-05' 

SELECT * FROM log_table 
WHERE DATE(log_date) > '2013-05-05' 

SELECT * FROM log_table 
WHERE DATE(log_date) BETWEEN '2013-04-05' AND '2013-05-05' 

SELECT * FROM log_table 
WHERE DATE(log_date) BETWEEN DATE(CURRENT_DATE() - INTERVAL 2 WEEK) AND 
DATE(CURRENT_DATE() + INTERVAL 4 DAY) 
+0

Może być prostsze, ale nie jest wydajne. Dam ci +1, jeśli powiesz mi, dlaczego. – Kermit

+1

dobrze, źle strzelać :). niemożliwe do użycia indeksy z wbudowanymi funkcjami w klauzuli WHERE – blotto

+4

+1 ding ding ding – Kermit

0

Można spróbować z tego ..

WHERE DATE_FORMAT(AUCTION_DATE, '%Y%m%d') >= DATE_FORMAT('2013/5/18', '%Y%m%d') 

Można również uzyskać datę dzisiaj korzystając teraz() funkcja.

+1

Nie powinieneś tego robić: 'DATE_FORMAT()' jest obliczane dla każdego wiersza, zamiast testowania względem stałej, która 'DATE_FORMAT ('2013/5/18', '% Y% m% d ') 'jest. Więc lepiej: "GDZIE AUKCJA_DATA> = DATA_FORMAT (" 2013/5/18 ","% Y% m% d ")", który może korzystać z indeksów. – Yvan