Autor | Zpráva | ||
---|---|---|---|
luma64 Profil |
#1 · Zasláno: 18. 4. 2017, 10:07:31
Zdravim, mám tbl objednavky. Jedno z polí sa volá datvyhotov, typ má DATE. Pri výbere záznamov v php kóde používam príkaz
Select o.datvyhotov from objednavky o where o.datvyhotov like '%2016%' V php kóde sa príkaz sa nevykoná, zobrazený html kód je Select * from objednavky where datvyhotov like '%2016%' Pri spustení v prostredí mysql (MysqlQueryBrowser) sa záznamy zobrazia, dostanem však hlášku Incorrect date value: '%2016%' for column 'datvyhotov' at row 1. V dátach to nie je (nemalo by byť), pole datvyhotov je vždy vyplnené nejakou hodnotou vo formáte YYYY-MM-DD. Kde by mohla byť chyba ? Ďakujem. |
||
Enko Profil |
#2 · Zasláno: 18. 4. 2017, 10:21:17
Pokud to chápu správně, chceš najít záznamy z roku 2016. to se dělá jinak. Například přes funkci year() v MySQL. Konkrétně třeba takto:
Select o.datvyhotov from objednavky o where year(o.datvyhotov) = '2016'; |
||
Tomášeek Profil |
#3 · Zasláno: 18. 4. 2017, 10:58:36
Enko:
Kvůli rychlosti dotazu lépe kombinací podmínek na datum >= '2016-01-01' a <= '2016-31-12' , ev. BETWEEN .
|
||
luma64 Profil |
#4 · Zasláno: 18. 4. 2017, 11:11:09
Ďakujem za radu! Vhodnejšie a jednoduchšie bolo použiť info od Enko; roky mám v rolete. Nemusel som teda skladať podmienky.
|
||
Enko Profil |
#5 · Zasláno: 19. 4. 2017, 09:30:22
Tomášeek:
Máš někde nějaký příklad o jak moc je použití funkcí year() pomalejší než použítí rozsahu dvou datumů? Tyto časové funkce používám celkem často a nezaznamenal jsem nějaký pomalý dotaz. |
||
Tomášeek Profil |
#6 · Zasláno: 19. 4. 2017, 09:32:54
Enko:
Při rozsahu se využije indexu nad sloupcem, při volání funkce nikoliv (každý řádek se musí prohnat funkcí a zjistit, jestli vyhovuje). U malých projektů asi nic nepoznáš, poznal bys u větších. |
||
juriad Profil |
Enko:
Je mezi nimui fundamentální rozdíl. Pří přímém porovnání datumů se může použít index a tedy výsledek je známý v čase log(N) + M , kde N je počet všech záznamů v tabulce a M je velikost výsledku, kdežto použitím funkce YEAR znemožníš použití indexu a vynutíš tedy full scan, který má složitost N .
Rozdíl bude markantní, pokud počet vyhovujících záznamů je malý a počet všech záznamů je velký. Napřiklad N=1000000 a M=100 vede k rozdílu v rychlosti o velikosti 4 řády. V případě roků a rovnoměrné distribuce záznamů velký rozdíl nebude (bude zhruba 1 řád), protože M nikdy nebude menší než N/50 (v databázi budeš mít maximláně desítky let záznamů). |
||
Enko Profil |
#8 · Zasláno: 19. 4. 2017, 09:54:53
Tomášeek, juriad:
Děkuji za hezké vysvětlení |
||
Časová prodleva: 7 let
|
0