Autor Zpráva
amorekj
Profil
Dobrý den,
nadpis zní jednoduše. Zněla by podmínka pro to i jednoduše, kdyby v databázi byly datumy, které by se vypisovaly. Je to složitější. V databázi jsou dva datumy ve tvaru dd.mm.rrrr (doslova - případně se zaplní prázdné místo nulou) a znamenají od - do. Když vypisuji z databáze a připisuji k nim hodnoty, vypisuji celou databázi datumů a ty se poté třídí (využívají se př. v kalendáři). Postupem času by se mohlo stát, že by výpis trval déle než by bylo nutné.

Mám tedy třeba 4 záznamy v databázi:
1: 23.09.2013 - 10.10.2013
2: 05.03.2014 - 20.10.2015
3: 04.02.2014 - 20.02.2014
4: 20.01.2014 - 10.02.2014

V kalendáři mám letošní měsíc a potřebuji tam zaznamenat pouze hodnoty, co se týkají února. Nepotřebuji záznamy z předešlého roku ani záznamy, co se týkají budoucna. Podotýkám, že záznamy tady nejsou v každém případě pouze dva, ale dva + všechny mezi tím. V tomto případě by se mi asi hodně rychle hromadila paměť PHP a všechny ostatní činnosti by určitě netrvaly jen pár milisekund.

Je možné upravit:
$vypis = mysql_query("SELECT * FROM `tabulka`");

Děkuji za rady. Omlouvám se za složitost.
PetrCZ
Profil *
mysql_query("SELECT * FROM `tabulka` WHERE `sloupec_s_intervalem` LIKE '%.02.%'");
Alphard
Profil
Stačí použít where stylem porovnání hraničních dat s prvním a posledním dnem intervalu: where do >= 01.02. and od <= 31.02.
Ale musíte s datem pracovat jako s datem (datový type DATE), nesmí to být obyčejný string. Tohle řešení je obecně správné.
Vzhledem k formátování by bylo použitelné i [#2], pokud je alespoň jedno hraniční datum vždy v únovu, ale už nemůžete blíže specifikovat třeba dny.
juriad
Profil
amorekj:
1. předělej datumy, aby byly typu DATE, ne VARCHAR.
Pak ti bude fungovat porovnávání pomocí operátorů < a >.

Co když budou některé události trvat několik let? Pak je podmínka o dost trikovější:
SELECT * FROM tabulka WHERE od <= '2014-02-28' AND do >= '2014-02-01'
PetrCZ
Profil *
Myslím, že bude lepší použít DATE_FORMAT() a OR, protože interval může zasahovat do dvou měsíců (pokud to není striktně zakázáno) a pak by při použití AND nebyla událost nalezena.
mysql_query("SELECT * FROM `tabulka` WHERE DATE_FORMAT(`od`, '%m') = '02' OR  DATE_FORMAT(`do`, '%m') = '02');
Popřípadě přidat i rok, když se bude kalendářem listovat (alepak zase pořešit přelom roku).
mysql_query("SELECT * FROM `tabulka` WHERE DATE_FORMAT(`od`, '%Y-%m') = '2013-02' OR  DATE_FORMAT(`do`, '%Y-%m') = '2013-02');
amorekj
Profil
Děkuji moc.. Moc mi to pomohlo :) :)
Kajman
Profil
amorekj:
Jen doufám, že nepoužíváte řešení od PetraCZ, ve kterém nebudou např. vypsány události začínající v lednu a končící v březnu. Korektní jsou jen rady v [#3] a [#4].

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: