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: Zápis pouze měsíc a den do databáze

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
petr.jouza
Člen
Avatar
petr.jouza:22.2.2019 19:17

Ahoj všem,
řeším tabulku v MySQL (respektive Maria DB) pro svátky (jmeniny i státní svátky). Pro práci s databází používám phpMyAdmin. Myslel jsem, že pro opakující se svátky využiji rok 1900. Problém nastal u přechodného roku 29.2.1900, který normálně existuje. Avšak při insertu mi to hlásí, že datum je incorect. Přitom 29.2.1904 i 29.2.1896 to vezme bez problému, ale datepicker v roce 1900 29.2. nezná. To samé je i v roce 1000 a 0000 se mi používat nechce. Nepřišel jsem na to, zda je to problém databáze nebo phpMyAdmina. Aktualizoval jsem si na nejnovelovější verze jak DB (v. 10.3.13), phpMyAdmina (v. 4.8.5) a dokonce i PHP (v. 7.3.2).

Dotaz tedy zní: Jak nejlépe použít tabulku, sloupce a typy, když potřebuji získat většinou jen den a měsíc? Navíc také potřebuji i velikonoční svátky, které jsou proměnné (vím, že existuje na to i funkce přímo v PHP, ale velikonoční svátky jsem si rozkopíroval od uváděného roku vzniku, až do roku 2099 samostatně jako celé datum). Je na to nějaké Best Practices, jak to má být vlastně správně? Dalším řešením mně napadlo, udělat sloupec datum, které bude moci být NULL a vytvořit i sloupec pro měsíc a sloupec pro den a tam zapisovat svátky opakující se.

Předem díky za rady, nápady či názory.

 
Odpovědět
22.2.2019 19:17
Avatar
Tomáš Novotný:22.2.2019 20:22

ahoj myslím, že 1900 nebyl přechodným rokem...pamatuji si poučku, že přechodný rok je jednou za 4 roky, pak jednou za 100 let není a nakonec jednou za 400 let je...
záleží docela co s tím plánuješ potom dělat... vygenerovat Velikonoce, je otázka... osobně jsem to řešil funkcí do které nacpeš datum a ona ti vyplivne, zda ten den je český státní svátek (umí i Velikonoce)
k dotazu -- v db bych použil normální typ datum

Nahoru Odpovědět
22.2.2019 20:22
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
mixxy
Člen
Avatar
mixxy:22.2.2019 23:01

Mezinárodně používaný občanský kalendář je gregoriánský kalendář, který má přestupný každý čtvrtý rok (rok dělitelný beze zbytku čtyřmi), ale roky dělitelné 100 jsou přestupné jenom tehdy, jsou-li dělitelné také 400. Přestupný rok má přidaný 29. únor.

Nahoru Odpovědět
22.2.2019 23:01
Neni dulezite mnoho vedet a znat. Dulezite je vedet, co je treba.
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Novotný
petr.jouza:23.2.2019 8:17

Díky... o tomto jsem nevěděl. Něco na tom asi bude. Teď jsem si zkusil i funkci PHP a ta mi při zadání date('Y-m-d',strtotime('1900-02-29')) vypíše 1900-03-01.
Nicméně v tomto mně zmátl excel, který mi normálně rok 1900 označil za přestupný a když jsem měl 28.2.1900+1, tak mi 29.2.1900 zobrazil (ale, že se divím... není to jediná věc, která je v excelu hloupá).

S funkcí pro velikonoce problém nemám, o té vím. Tabulku chci využít k vícero účelům. Jak pro zobrazení svátku na webu (jak státního, tak jmenin), tak pro zjištění dne, zda se jedná o státní svátek.

Píšeš, že bys použil normální typ datum, ale co bys použil za rok, abys měl platný formát?

Editováno 23.2.2019 8:19
 
Nahoru Odpovědět
23.2.2019 8:17
Avatar
petr.jouza
Člen
Avatar
Odpovídá na mixxy
petr.jouza:23.2.2019 8:26

Díky, to upřesňuje příspěvek Tomáše. Jak jsem psal v odpovědi Tomášovi: V tom mně zmátl excel, který mi rok 1900 označil za přestupný. Když jsem v excelu napsal funkci 28.2.1900+1, tak mi datum 29.2.1900 vyhodil.

Jen tedy stále nějak netuším, jak uchopit ten zápis do DB pro opakující se svátky (jak státní, tak jmeniny).

 
Nahoru Odpovědět
23.2.2019 8:26
Avatar
Odpovídá na petr.jouza
Tomáš Novotný:23.2.2019 8:40

Když už by to bylo tedy v DB a jedné tabulce, tak je podle mne docela jedno v jakém roce jsou ty svátky uloženy... můžeš použít přeci konstrukci ve smyslu WHERE typ = 'svátek' AND datum LIKE '%-01-01' což by mělo vrátit událost patrně s názvem Nový rok .. takže asi nejlepší to nacpat do nějakého přestupného roku
osobně bych to řešil, ale separé... uvedu příklad... mám tabulku na události z kalendáře, která má 100k+ záznamů, v tabulce jsou ale i kalendářové svátky, jelikož mají velmi shodné parametry s událostmi.... potíže ale mohou nastávat tehdy pokud jsou špatně nastavené klíče/indexy a např. si vymyslím, že na hlavní stránce budu zobrazovat svátek pro dnešní den...každé načtení stránky díky dotazu prohledává velkou tabulku událostí kvůli svátku.. (teď pomiňme technologie cache na různých místech)
takže zpět k tomu, co jsem již psal ... docela záleží na použití, případně množství budoucích dat...

Editováno 23.2.2019 8:42
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
23.2.2019 8:40
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Novotný
petr.jouza:23.2.2019 9:17

To samozřejmě ano. Pro ty svátky mám samostatnou tabulku, která bude mít max. 1000 záznamů. Určitě bych to nemíchal v jedné tabulce např. s událostmi. To by mi přišlo dost nepraktické.
Zkusím si to nějak v hlavě srovnat a pak snad něco vyplodím :)
Moc díky za upřesnění přestupného roku.

 
Nahoru Odpovědět
23.2.2019 9:17
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 7 zpráv z 7.