2010-09-07 10 views
5

Pracuję na bazie danych, które przechowują daty w polu mysql varchar(10) (tak smutne).Mysql: konwersja daty z "dd/mm/rrrr" na "yyyymmdd"

Nie mogę zmienić struktury bazy danych (buduję małą wtyczkę), ale muszę wysłać zapytanie do bazy danych, aby znaleźć wiersze, w których to pole danych znajduje się w ciągu najbliższych 10 dni.

przykład:

| fid | fdate  | 
| 1 | 10/09/2010 | 
| 2 | 17/09/2010 | 
| 3 | 19/09/2010 | 

muszę się wierszy z FID 1 i 2, becose data jest teraz < = + 10 dni.

Zazwyczaj robię tego rodzaju zapytania:

SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

Lub, jeżeli data jest w formacie `yyyymmdd ':

SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), '%Y%m%d'); 

Ale oni są bezużyteczne z formatem dd/mm/yyyy.

Mam zorientowali się z

SELECT fid, CONCAT(SUBSTRING(fdate, 7, 4), SUBSTRING(fdate, 4, 2), SUBSTRING(fdate, 1, 2)) AS mydate FROM table HAVING mydate <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

ale myślę, że jest trochę overkill odbudowy format daty concat i podciągu, a klauzula having przyzwyczajenie pomóc prędkość zapytania.

Każdy pomysł?

EDIT

Po komentarzu Adriano, właściwym rozwiązaniem jest

SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY); 

więc mogę uniknąć klauzuli concat i posiadające.

+0

Możesz użyć 'where' zamiast' having', ale poza tym wydajesz się, że rozwiązałeś problem - więc o co dokładnie pytasz? – Andomar

+0

W ostatnim zapytaniu, które napisałem, nie mogę użyć "GDZIE" zamiast "HAVING", ponieważ pole 'mydate' faktycznie nie istnieje w tabeli, gdy wykonywana jest klauzula" WHERE ". – Strae

Odpowiedz

7

Co zrobić, jeśli chcesz utworzyć datę z formatu za pomocą str_to_date()?

EDIT po przeczytaniu Twojego komentarza, stworzyłem tabelę jak Twoja:

mysql> SELECT fid, fdate FROM test; 
+------+------------+ 
| fid | fdate  | 
+------+------------+ 
| 1 | 10/9/2010 | 
| 2 | 17/9/2010 | 
| 3 | 19/09/2010 | 
+------+------------+ 

a następnie zrobił

mysql> SELECT fid FROM test WHERE STR_TO_DATE(fdate, '%d/%m/%Y') <= DATE_ADD(NOW(), INTERVAL 10 DAY); 
+------+ 
| fid | 
+------+ 
| 1 | 
| 2 | 
+------+ 

wydaje się działać. Co dokładnie otrzymujesz?

+0

Próbowałem, w przykładzie, który działa z przecinkiem (0 097, 2 010), ale nie z ukośnikami (07/09/2010), to jest mój przypadek ... muszę najpierw zastąpić "/" przez ',', a następnie str_to_date – Strae

+0

Przykład pokazuje również "SELECT STR_TO_DATE ('04/31/2004 ','% m /% d /% Y ');' working. –

+0

Oooops, masz rację, kiedyś zapisałem nieprawidłowy format, jako '% m-% d-% Y' zamiast'% m /% d /% Y'! dzięki chłopaki – Strae