Autor Zpráva
Gezzy
Profil *
Dobrý deň,

mám tabuľku v ktorej mám udalosti, ktoré sa diali počas datumA a datumB..

štruktúra
id
datumA (v podstate zaciatok udalosti)
datumB (koniecUdalosti)
popis

Okrem toho mám v tabuľke skúšobné dáta:
ID  datumA datumB Popis
1 2014-01-01 2015-10-20 Popis
2 2009-01-02 2013-06-17 Popis 
3 2012-01-01 2012-02-22 Popis
4 2009-01-04 2013-06-14 Popis 
5 2013-01-05 2013-06-11 Popis
6 2009-01-06 2009-06-07 Popis
7 2009-01-07 2010-06-09 Popis
8 2011-01-08 2012-06-17 Popis 
9 2009-01-09 2013-06-19 Popis
10 2010-01-10 2013-06-10 Popis
11 2012-01-11 2009-06-02 Popis
12 2009-01-12 2010-06-03 Popis
13 2010-01-13 2014-06-08 Popis

A potreboval by som vytiahnuť všetky záznamy ktoré trvali resp. boli aktívne napr. počas roku 2013, teda v tomto prípade 2, 4, 5, 9, 10 a 13. Skúšal som podmienku s IN alebo Between, dá sa povedať že som dosť zmetený, nejako mi uniká logika toho celého. Viete ma prosím niekto nasmerovať?

Ďakujem


riešim dotaz ktorý by mal byť súčasť php kodu na filtrovanie


Mohlo by to byť takto?

SELECT * FROM tabulka WHERE YEAR(datumA )<=2013 and YEAR(datumB )>=2013
lionel messi
Profil
Gezzy:
Mohlo by to byť takto?
>
>
SELECT * FROM tabulka WHERE YEAR(datumA )<=2013 and YEAR(datumB )>=2013

Áno.
Kajman
Profil
Já bych year nepoužíval, může to zpomalovat (např. nedokáže použít index nad sloupci).

SELECT * FROM tabulka WHERE datumA<='2013-12-31' AND datumB>='2013-01-01'
lionel messi
Profil
Gezzy:

Ešte stručne vysvetlím operátory IN a BETWEEN:

WHERE stlpec IN (hodnota1, hodnota2, hodnota3) je vlastne alternatíva k WHERE stlpec = hodnota1 OR stlpec = hodnota2 OR stlpec = hodnota3. Pre tvoje účely sa príliš nehodí, chceš totiž kontinuálne dátumy spred iného dátumu alebo po ňom.

Napríklad ak by ťa zaujímali povedzme len udalosti so začiatkom napr. v rokoch 2000, 2010 a 2013, tu by už IN bolo zaujímavejšie (samozrejme, funkcia YEAR má nedostatky, o ktorých písal Kajman, ide len o ilustráciu):

SELECT * FROM tabulka WHERE YEAR(datumA) IN (2000, 2010, 2013)

BETWEEN hodnota1 AND hodnota2 vracia výsledky pre všetky stĺpce medzi dvomi hodnotami (WHERE id BETWEEN 2 AND 4 vráti stĺpce s id 2, 3 alebo 4). Ak poznáš najskorší možný dátum v stĺpci datumA, dal by sa tvoj dotaz riešiť aj cez BETWEEN (znovu len pre ilustráciu, Kajmanovo riešenie je lepšie - okrem rýchlosti aj preto, že sa nemusíš zaoberať začiatkom prvej udalosti). Povedzme, že prvá udalosť sa začala v roku 2000.

SELECT * FROM tabulka 
  WHERE datumA BETWEEN '2000-01-01' AND '2013-12-31'
  AND datumB BETWEEN '2013-01-01' AND NOW()

Myslím, že ťažkopádnosť oproti [#2] je zreteľná.
Geezy
Profil *
Ďakujem Vám páni!

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:

0