Mám databázi "zapasy" (id, datum, zapas, vysledek, ...)
Potřebuji napsat něco jako výsledkový servis, kam se budou vypisovat zápasy z databáze. Problém je v tom, že bych chtěl vypisovat vždy zápasy z aktuálního týdne. Nejlépe od soboty do příští neděle = víkend+týden+víkend, ale to není tak podstatné.
Nenapadá vás někoho, jak napsat proceduru, která by zjistila dnešní datum, podle něj určila interaval aktuálního týdne a vybrala zápasy z databáze?
Moc se nevyznám v funkcích pracujících s časem, ale představoval bych si to nějak takhle:
1) získat z aktuálního Greenwichského času aktuální den
2) najít k tomuto dni nejbližší předešlou sobotu a následující neděli
3) takto zjištěnou sobotu a neděli převést zpět na Greenwichský čas
4) zadat podle toho podmínku do databáze
Je mi jasné, že to tady nikdo nenapíše rovnou, to by bylo pro mě příliš jednoduché. Tak mi prosím alespoň popište, jak použít těch časových funkcí.
Díky,
PAVEL
Nic extra, ale tohle by ti mohlo helfnout (radsi sem ti dal verzi v cestine):
http://www.php.net/manual/cs/function.date.php
Díky za odpověď, popis funkce Date() už jsem měl, ale stejně. Zkusil jsem narychlo napsat aspoň funci na zjištění aktuálního dne:
// vstup z databáze: yyyy-mm-dd
function getDay($datum)
{
$day = Date("w",MkTime(0,0,0,(SubStr($datum,4,2),(SubStr($datum,6,2),(SubStr($datum,0,4)));
return $day;
}
Ale teď to vypadá, že klient bude chtít vypisovat zápasy za poslední měsíc a ne týden :-), takže se do toho můžu pustit znova.
S tím nastává další problém:
Nevím jak určit "horní hranici" intervalu daného měsíce - jestli končí 30., 31. nebo 28., ....
Asi tu založím další článek :)
PAVEL
Dyt funkci date muzes taky vypsat den v tydnu, ne? Nebo blbe vidim???
SELECT * FROM zapasy WHERE (datum >= DATE_ADD(CURRENT_DATE, INTERVAL 9 DAY))
By mohlo být vyber všechny záznamy z tabulky zapasy vždy od současného data po datum následující 9 dnů po aktuálním datu.
Ale když chceš v aktuálním týdnu vypisovat i staré zápasy (třeba je středa, ale ty chceš ukazovat zápasy od poslední soboty...viz.výše, musí se to modifikovat...), takže ...
$dnesni_den = date("w"); //určí číslo dne v týdnu, kde 0 je neděle
if($dnesni_den != '6') { //pokud dnes není sobota
$interval_nove = 9-$dnesni_den-1; //9=víkend + prac.týden+víkend dnů
$interval_stare = $dnesni_den+2;
//následující query vypíše zápasy následující po současném datu, ale maximálně do příští neděle NEBO(a zároveň) vypíše zápasy, které jsou n dnů staré - když je středa, vypíše zápasy sobota až středa
$query = mysql_query("SELECT DISTINCT * FROM zapasy WHERE ((datum >= DATE_ADD(CURRENT_DATE, INTERVAL $interval_nove DAY)) OR (datum <= DATE_SUB(CURRENT_DATE, INTERVAL $interval_stare DAY)))");
} else {
$query = mysql_query("SELECT * FROM zapasy WHERE (datum >= DATE_ADD(CURRENT_DATE, INTERVAL 9 DAY))");
}
//a teď už to jen vypsat...
Nezaručuju ale, že je to správně, ale určitě bych na to šel nějak takto a zbytek už doladil. Možná tam mám až moc závorek, nějak jsem se v tom zamotal a taky by bylo potřeba experimentálně upravit to číslo 9, eventuelně příčítání +2 a -2 v $interval_xxxx a nebo si to v hlavě propočítat a pak by mohl přijít pryč ten DISTINCT a upravit >= a <=, aby se optimalizoval dotaz do DB
Dále z Tvého požadavku vyplývá, že se Ti musí datumy překrývat. Chceš zobrazovat všechno od soboty do příští neděle, ale ta příští sobota do toho bude vnášet zmatek, proto ten skript výše udělá to, že jakmile je sobota, už ukáže výpis na následující týden+víkend, ale to snad oželíš. Jinak nevím, jak bych to řešil. Ber to prosím jako inspiraci, je to taková zkomolenina, ale v jednodušší verzi už jsem ji s úspěchem použil.
*S tím nastává další problém:
Nevím jak určit "horní hranici" intervalu daného měsíce - jestli končí 30., 31. nebo 28., ....
*
MySQL to udělá za tebe....o to se starat nemusíš, nebo se do toho zamotáš. Kdybys přece jen ale chtěl udělat něco, co už udělal někdo jiný za Tebe, můžeš využít $pocet_dnu_mesice = date("t");
2 Arnie:
Fakt moc díky, ani jsem netušil, co všechno SQL umí :-) Já pořád zůstávám u těch nejzáklednjších SELECTů ... Určitě to zkusím a uvidí se!
Já mám totiž databázi zápasů a chci napsat, jak jsem ríkal, něco jako "výsledkový servis". Takže vlastně stránku, na kterou se z databáze vypíšou všechny zápasy daného družstva podle nějakého klíče.
Dole by měl uživatel možnost listovat i ve starších údajích.
Takže: první týden, novější, starší, nejstarší + něco jako vypsat od 17.12.2002
První mě tada napadlo vypisovat po týdnech, ale zjistil jsem, že se stejně odehrajou tak max. 3 zápasy za týden.
Potom jsem to změnil na měsíce, ale zase mi přijde nepraktické, že půl víkendu (kdy se hrajou zápasy) může být v jednom měsíci a další část v druhém.
Nejspíš teda udělám tu první stránku jako výběr za posledních x dní a dole umožním návštěvníkovi rozsáhlejší možnosti, jak prohlížet starší věci.
např.
- vypsat dalších 30, dalších 30, ...., nejstarší
- vybrat měsíc, rok
- všechny zápasy za určitou sezónu
atd.
Ještě jednou díky,
PAVEL