Autor | Zpráva | ||
---|---|---|---|
mackopu Profil |
#1 · Zasláno: 12. 3. 2008, 16:43:01 · Upravil/a: mackopu
Mám tabulku událostí:
CREATE TABLE `events` ( `id` int(11) NOT NULL auto_increment, `titulek` varchar(255) NOT NULL, `popis` text NOT NULL, `date` date NOT NULL, `time` time NOT NULL, `date_to` date NOT NULL, `recursive` varchar(7) NOT NULL, `recursive_to` date NOT NULL, PRIMARY KEY (`id`) ); "time", "date_to", "recursive" a "recursive_to" mohou být prázdné (respektive u časových a datových formátů 00:00:00 či 0000-00-00). "Recursive" může být rovněž yearly, monthly nebo weekly. A nyní potřebuji vybrat záznamy, které se týkají dnešního dne, tj. něco jako SELECT titulek FROM events WHERE date = '2008-03-12' Jak na to? |
||
ninja Profil |
#2 · Zasláno: 12. 3. 2008, 18:56:00
mackopu: Nemas uplne nejlepe navrzenou strukturu databaze. Mel bys mit tabulku events kde by byl titulek, popis a tak a pak tabulku events_instants kde by byly instance daneho eventu. Sloupce date, event_id. Jeden event ma vice instanci.
Pri vlozeni noveho eventu mu dle nastaveni (napriklad kazdorocni opakovani) vytvoris odpovidajici pocet radek v events_instants. Pokud nemuzes menit strukturu, tak asi neco jako: SELECT titulek FROM events WHERE date = '2008-03-12' OR (recursive_to <= '2008-03-12' AND recursive = 'monthly' AND DAY(date) = '12'); |
||
mackopu Profil |
#3 · Zasláno: 12. 3. 2008, 19:32:10
Strukturu opravdu měnit nemohu.
Zkusím to a dám vědět, díky. |
||
mackopu Profil |
#4 · Zasláno: 13. 3. 2008, 08:46:05 · Upravil/a: mackopu
Tak tohle funguje dobře pro měsíční a roční opakování:
SELECT titulek FROM events WHERE date = '2008-03-13' OR ( recursive_to <= '2008-03-13' AND recursive = 'monthly' AND DAY( date ) = '13' ) OR ( recursive_to <= '2008-03-13' AND recursive = 'yearly' AND DAY( date ) = '13' AND MONTH( date ) = '03' ) OR (recursive_to <= '2008-03-13' AND recursive = 'weekly' ... ) |
||
nightfish Profil |
#5 · Zasláno: 13. 3. 2008, 09:06:07
Co ale s opakováním týdenním?
potřebuješ, aby rozdíl dvou uvedených datumů, vyjádřený ve dnech, byl dělitelný sedmi (resp. jeho celá část aby byla dělitelná sedmi) DATEDIFF(datum1, datum2) MOD 7 = 0 |
||
Kajman_ Profil * |
#6 · Zasláno: 13. 3. 2008, 09:13:58
Co ale s opakováním týdenním?
dayofweek(date)=dayofweek('2008-03-13') Ale osobně bych také měnil strukturu. Asi bych si tam předpočítával při spuštění události datum dalšího spuštění (asi ze dvou sloupečků, počet dnů a počet měsíců pro opakování). Ty podmínky, co teď máte, nebudou fungovat korektně. Třeba měsíční opakovaní k 31.3. se nebude opakovat měsíčně. Ani roční opakovaní k 29.2. se nebude opakovat ročně. |
||
ninja Profil |
#7 · Zasláno: 13. 3. 2008, 10:16:04
mackopu:
DATEDIFF(datum1, datum2) MOD 7 = 0 Pokud jedes na Mysql < 4.1 kde neni DADIFF, tak muzes pouzit: (TO_DAYS(datum1) - TO_DAYS(datum2)) MOD 7 = 0 |
||
ninja Profil |
#8 · Zasláno: 13. 3. 2008, 10:17:24
Kajman_: Ty podmínky, co teď máte, nebudou fungovat korektně. Třeba měsíční opakovaní k 31.3. se nebude opakovat měsíčně. Ani roční opakovaní k 29.2. se nebude opakovat ročně.
Presne. Neni divu ze prakticky ve vsech aplikacich se pri nastaveni periodickeho opakovani rovnou predvyplni instance do daleke budoucnosti (vetsinou 2038, stejne vic ve svete unix timestampu nema smysl). |
||
mackopu Profil |
#9 · Zasláno: 13. 3. 2008, 10:29:01
Opravdu nic měnit nemohu.
Nefunkční opakování v uvedených příkladech je ošetřeno při zadávání do formuláře. A nyní: SELECT titulek FROM events WHERE date = '2008-03-13' OR ( recursive_to <= '2008-03-13' AND recursive = 'weekly' AND DAYOFWEEK(date) = DAYOFWEEK('2008-03-13') ) OR ( recursive_to <= '2008-03-13' AND recursive = 'monthly' AND DAY(date) = '13' ) OR ( recursive_to <= '2008-03-13' AND recursive = 'yearly' AND DAY(date) = '13' AND MONTH(date) = '03' ) |
||
mackopu Profil |
#10 · Zasláno: 13. 3. 2008, 10:45:31
Tak tohle už chodí:
SELECT titulek FROM events WHERE date = '2008-03-13' OR ( '2008-03-13' >= date AND recursive_to <= '2008-03-13' AND recursive = 'weekly' AND DAYOFWEEK(date) = DAYOFWEEK('2008-03-13') ) OR ( '2008-03-13' >= date AND recursive_to <= '2008-03-13' AND recursive = 'monthly' AND DAY(date) = '13' ) OR ( '2008-03-13' >= date AND recursive_to <= '2008-03-13' AND recursive = 'yearly' AND DAY(date) = '13' AND MONTH(date) = '03' ) |
||
Časová prodleva: 16 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0