IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Porovnání datumů

Aktivity
Avatar
maxijoey
Člen
Avatar
maxijoey:4.6.2018 11:35

Zdravím ve spolek,
mám trochu problém. V DB se mi vyskytuji datumy v těchto formátech: 14.06.2018, 14-06-2018, 14.6.2018
Jsou uložené jako stringy. Jak to jednoduše porovnám s aktuálním datem.
Něco jako CURDATE() < datum, mi zafunguje jen na některé.

Zkusil jsem: Zkoušim to i konvertovat nějak takto: STR_TO_DATE(da­tum,'%Y.%m.%d') ale také to zabere jen na některé.

Chci docílit: Existuje nějaká funkce co mi to převede na jednotný formát datumu at je zdrojový jakýkoli na něco porovnatelného s CURDATE?

 
Odpovědět
4.6.2018 11:35
Avatar
Luboš Běhounek Satik:4.6.2018 11:48

Vyresit tohle je jednoduchy, staci ty datumy ulozit do DB ve spravnym formatu, tohle je proste spatne.

Vyhodu krome toho, ze to pak bude fungovat, budes mit i v tom, ze datum je ulozeny interne jako cislo, takze to porovnani bude mnohem rychlejsi a ty data aspon budou konzistentni.

Nahoru Odpovědět
4.6.2018 11:48
https://www.facebook.com/peasantsandcastles/
Avatar
Adam Ježek
Tvůrce
Avatar
Adam Ježek:4.6.2018 11:52

Pokud ti návrh aplikace neumožňuje to ukládat všechno ve stejném formátu (což je špatný návrh), tak bych přidal ještě jeden sloupeček, který nebude pro text, ale typu datetime, a měl skript, který bude průběžně kontrolovat záznamy a nevyplněným datem v tom novém sloupečku a doplňovat to.
Pak to budeš porovnávat podle tohohle sloupečku a nemusíš řešit, že ty funce všechny očekávají stejný formát data.

Nahoru Odpovědět
4.6.2018 11:52
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
maxijoey
Člen
Avatar
Odpovídá na Luboš Běhounek Satik
maxijoey:4.6.2018 11:56

No to je přesně to co jsem nechtěl slyšet, i když vím že to je asi řešení mít to ve stejném :-) Já vím že to mám blbě, to byli začátky, tak se snažím to obejít. Ono těch tabulek není málo zrovna na předělání.
Když už vás mám na drátě, někde jsem také četl v té souvislosti, že není moc dobré to ukládat ani jako DATE ale jako u int (time()) když už a porovnávat tento údaj. Respektive ten počet tiků od toho roku 1970 nebo od kdy. Víte o tom někdo něco? Výhody, nevýhody atd?

 
Nahoru Odpovědět
4.6.2018 11:56
Avatar
maxijoey
Člen
Avatar
maxijoey:4.6.2018 11:58

Adame, nemám problém aby mi to aplikace ukládala jednotně, jen jsem dlouho nevěděl který formát použít aby to nezlobilo tak jsem v tom nadělal takovou to paseku

 
Nahoru Odpovědět
4.6.2018 11:58
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na maxijoey
Petr Čech:4.6.2018 12:16

IMHO se to interně bude ukládat buď úplně stejně nebo velice podobně, takže to je jedno. A i kdyby to těch pár tiků stálo, nemělo by to smysl, to datum tam je především proto, aby to bylo srozumitelné člověku a bylo jednoznačně jasné, co to je zač a každý programátor, co k tomu přijde bude vědět.
Touto filozofií bys rovnou mohl psát v assembleru a říkat, že předávání parametrů přes zásobník se zbytečně pomalé a tobě budou stačit registry, protože tím se pár tiků ušetří...
Jinak ten "počet tiků" se jmenuje UNIX time a je to počet sekund od 1.1.1970

Editováno 4.6.2018 12:17
Nahoru Odpovědět
4.6.2018 12:16
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na maxijoey
Petr Čech:4.6.2018 12:20

Víc k tomu: https://stackoverflow.com/…ype-in-mysql
nejužitečnější jsou asi 2. a 3. komentář

Nahoru Odpovědět
4.6.2018 12:20
the cake is a lie
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.6.2018 12:44

Viz Adam Ježek, take bych pridal sloupecek a zkonvertoval datumy do spravneho formatu. Poopravoval sql dotazy a pak ty spatne sloupecky smazal nebo je ponechal.

14.06.2018, 14-06-2018, 14.6.2018
STR_TO_DATE(da­tum,'%Y.%m.%d')
V php bych pouzil preg_replace. odstranil nuly, nadbytecne znaky, prevedl na jeden format a pak to pres tu funkci konvertoval. Jak se to pise v sql nevim, ale dalo by se to vygooglovat.

$str = preg_replace('~[-]~', '.', $str); // zmenit minuska na tecky
$str = preg_replace('~^0()(\d+)([.])|([.])0(\d+)([.]))|([.])0(\d+)()$~','$1$2$3',$str); // vynech nuly NEBO jina verze:
$str = preg_replace('~^()0*|([.])0*~','$1',$str); //  (zacatek-nic-nula nebo tecka-nula)
 
Nahoru Odpovědět
4.6.2018 12:44
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4.6.2018 12:48

Edit: Urcite vych nedaval kombinaci reg. vyrazu a str_to_date do sql prikazu do WHERE. Kazdy radek by to musel konvertovat. Pro vetsi pocet zaznamu, rekneme 1000, by to mohlo vyznamne brzdit, treba 300 ms misto beznych 5-30 ms.

 
Nahoru Odpovědět
4.6.2018 12:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.