Diskuze: Porovnání datumů

Ostatní jazyky SQL SQL a databáze Porovnání datumů

Aktivity (1)
Avatar
maxijoey
Člen
Avatar
maxijoey:4. června 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. června 11:35
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Luboš Satik Běhounek:4. června 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  +1 4. června 11:48
https://www.facebook.com/peasantsandcastles/
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:4. června 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. června 11:52
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
maxijoey
Člen
Avatar
Odpovídá na Luboš Satik Běhounek
maxijoey:4. června 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. června 11:56
Avatar
maxijoey
Člen
Avatar
maxijoey:4. června 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. června 11:58
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na maxijoey
Petr Čech:4. června 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. června 12:17
Nahoru Odpovědět 4. června 12:16
the cake is a lie
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na maxijoey
Petr Čech:4. června 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. června 12:20
the cake is a lie
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. června 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. června 12:44
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:4. června 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. června 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.