Autor | Zpráva | ||
---|---|---|---|
Jackyl Profil * |
#1 · Zasláno: 26. 2. 2011, 18:36:11
Zdravim,
mám tento dotaz do db, který mi má vytáhnout narozeniny v daném měsící, ale např. dnes mi to již tahá narozeniny z března, dá se to nějak upravit? Díky select * from `hraci` where date_format(`datum`,'%m%d') between date_format(curdate(),'%m%d') and date_format(adddate(curdate(),interval 30 day),'%m%d') ORDER BY datum ASC |
||
TomášK Profil |
#2 · Zasláno: 26. 2. 2011, 18:50:26
Jackyl:
Tohle je dost velké zlo - převádíš datum na řetězec a pak porovnáváš řetězce, ve správném řešení by date_format nemělo být. Dobrý přístup je vygenerovat si krajní data intervalu (přesné dny) a zkoumat, jestli je hledané datum mezi nimi. Většinou je jednodušší generovat to na straně aplikace, ale i v MySQL to jde. |
||
Alphard Profil |
#3 · Zasláno: 26. 2. 2011, 18:52:15
where month(now()) = month(date_insert) Použití funkce na sloupec je pomalé, ale tady mě nenapadá, jak to sestavit jinak. Když to bude u velké tabulky brzdit, přidejte do databáze samostatný sloupec s měsícem narození a porovnávejte podle něho. Nebo porovnání krajních hodnot intervalů, viz [#2]. |
||
_es Profil |
#4 · Zasláno: 26. 2. 2011, 18:56:24
Alphard:
„Použití funkce na sloupec je pomalé, ale tady mě nenapadá, jak to sestavit jinak“ Pred zostavením dotazu zistiť maximálny a minimálny rozdiel v dátumoch a tie použiť v dotaze. |
||
Alphard Profil |
#5 · Zasláno: 26. 2. 2011, 19:05:21
_es:
Tak ano, já myslel nějaké jednoduché řešení. Zase z toho nechci dělat kovbojku. Teď jsem where uvedený v [#3] (bez úprav) použít na tabulce s 900 záznamy, výsledek 0.000 s, takže neměřitelný. Pak jsem to zkusil u tabulky s 140000 záznamy a 0.008 s. Jestli má Jackyl desítky až stovky hráčů, nemusí to vůbec komplikovat. |
||
Časová prodleva: 13 let
|
0