Autor Zpráva
luma64
Profil
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
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';
Příklad nemám ozkoušený, ale mělo by to tak být.
Tomášeek
Profil
Enko:
Kvůli rychlosti dotazu lépe kombinací podmínek na datum >= '2016-01-01' a <= '2016-31-12', ev. BETWEEN.
luma64
Profil
Ď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
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
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
Tomášeek, juriad:
Děkuji za hezké vysvětlení

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: