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.
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
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