Im pracovať na databáze, ktorá ukladá dáta v varchar(10)
mysql pole (tak smutné).
Nemôžem zmeniť štruktúru databázy (im budovanie malý plug-in), ale musím dotaz databázu nájsť riadky, kde je toto dátové pole medzi najbližších 10 dní.
Príklad:
| fid | fdate |
| 1 | 10/09/2010 |
| 2 | 17/09/2010 |
| 3 | 19/09/2010 |
Musím dostať riadky s fid 1 a 2, becose dátum je <= teraz + 10 dní.
Obvykle robím tento druh dopytu:
SELECT fid FROM table WHERE fdate <= DATE_ADD(NOW(), INTERVAL 10 DAY);
Alebo ak je dátum vo formáte `yyyymmdd ':
SELECT fid FROM table WHERE fdate <= DATE_FORMAT(NOW(), "%Y%m%d");
Ale s formátom sú k ničomu dd/mm/yyyy
.
Prišiel som na to
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 myslím, že je to trochu overkill prestavba formát dátumu s concat a podreťazec, a having
klauzule zvyknutý pomáhať rýchlosti dotazu.
Nejaký nápad?
UPRAVIŤ
Po Adrianovom komentári je správne riešenie
SELECT fid FROM test WHERE STR_TO_DATE(fdate, "%d/%m/%Y") <= DATE_ADD(NOW(), INTERVAL 10 DAY);
tak sa môžem vyhnúť concatu a mať klauzulu.
odpovede:
7 pre odpoveď č. 1A čo s použitím str_to_date () vytvoriť dátum z vášho formátu?
UPRAVIŤ po prečítaní komentára som vytvoril tabuľku, ako je tá vaša:
mysql> SELECT fid, fdate FROM test;
+------+------------+
| fid | fdate |
+------+------------+
| 1 | 10/9/2010 |
| 2 | 17/9/2010 |
| 3 | 19/09/2010 |
+------+------------+
a potom
mysql> SELECT fid FROM test WHERE STR_TO_DATE(fdate, "%d/%m/%Y") <= DATE_ADD(NOW(), INTERVAL 10 DAY);
+------+
| fid |
+------+
| 1 |
| 2 |
+------+
Zdá sa, že funguje. Čo presne dostanete?