Porovnání datumových rozsahů – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Porovnání datumových rozsahů – PHP – Fórum – Programujte.comPorovnání datumových rozsahů – PHP – Fórum – Programujte.com

 

David
~ Anonymní uživatel
177 příspěvků
30. 5. 2024   #1
-
0
-

Ahoj,

nedokážu si poradit s porovnáním dvou časových oken.

V MYSQL databázi mám záznam, který je platný od 1.1.2024 do 31.3.2024 (2 datumy, sloupce v záznamu v db)

Následně v PHP vypisuji údaje ze zadaného rozsahu uživatele z formuláře, který chci hlídat v rozsahu datumů z DB

např.

1.3.2024 - 5.3.2024 - zobrazí záznam z DB

20.3.2024 - 15.5.2024 - zobrazí záznam DB

3.5.2024 - 15.5.2024 - nezobrazí záznam DB

jak vůči sobě porovnávat dva rozsahy datumů a v případě průsečíku je zobrazit? Napadá mě pouze hloupě kontrolovat, zda alespoň jeden záznam z rozsahu zadaného uživatelem je v okně rozsahu z databáze.

Děkuji za případnou sofistikovanější radu

Nahlásit jako SPAM
IP: 2a00:ca8:a17:2cb8:b4f5:e01c:8f1b:e53c...–
David
~ Anonymní uživatel
177 příspěvků
30. 5. 2024   #2
-
0
-

#1 David
vyřešeno tupě v PHP limitama

   if (
        ($datum_pocatek_iso >= $pocatek AND $datum_konec_iso <= $konec)
        OR
        ($datum_pocatek_iso >= $pocatek AND $datum_konec_iso >= $konec AND $datum_pocatek_iso <= $konec)
        OR
        ($datum_pocatek_iso <= $pocatek AND $datum_konec_iso <= $konec AND $datum_konec_iso >= $pocatek)
        
        )

Nahlásit jako SPAM
IP: 2a00:ca8:a17:2cb8:b4f5:e01c:8f1b:e53c...–
gna
~ Anonymní uživatel
1863 příspěvků
30. 5. 2024   #3
-
0
-

Není mi z toho jasné, co chceš udělat. Teď máš toto:

* pokud je začátek i konec v hledaném intervalu
* nebo je začátek v hledaném intervalu a konec je po
* nebo je začátek před a konec je v hledaném intervalu

Jestli chceš záznamy, které začínají nebo končí v hledaném intervalu, tak to přesně tak napiš (začátek v intervalu nebo konec v intervalu).

Ale jestli chceš libovolný "překryv" tak ti tam chybí možnost, že začátek je před a konec po. A v tomhle případě teda nemusíš vypisovat všechny varianty a stačí testovat jestli jsou ty intervaly úplně mimo a výsledek znegovat (když nejsou mimo, tak se nějak překrývají).

not (pozadavek_konec < db_zacatek or db_konec < pozadavek_zacatek)

V SQL jde tyhle podmínky psát podobně jako v PHP. Je na to klauzule WHERE.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1863 příspěvků
30. 5. 2024   #4
-
0
-

Teď mně napadá, že by ten NOT-OR šel přepsat na AND, což by mělo být rychlejší...

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3984 příspěvků
31. 5. 2024   #5
-
0
-

Ja asi vim, co chce udelat, ale nevim, zda mu chci poradit :) Pac, kdyz si na to prijde sam, bude ho to tesit vic :)

Pravdepodobne se pokousi zjistit, zda se nejake useky prekryvaji. Nebo vypsat vsechny useky mezi dvema datumy.

C1-C2, D1-D2, E1-E2 zda se nachazi mezi A1-A2

A1 (C1-C2 D1-D2 E1-E2) A2
Pokud je to mezi A1-A2, tak
- vsechny x1 musi byt >=A1 a soucasne
- vsechny x2 musi byt <=A2
A1<=x1 and x2<=A2

A neco podobne plati u prekryvani
....A1----A2
........B1----B2     (B1<A2<B2)
..C1----C2           (C1<A1<C2)
......D1-D2          (A1>D1 and D2<A2)
Cili, prekryva se to, kdyz
- A1<=B1<A2 or A1<B2<=A2
- A1<=C1<A2 or A1<C2<=A2
- A1<=D1<A2 or A1<D2<=A2
Jeden z bodu je uvnitr prostoru A1-A2.
Nahlásit jako SPAM
IP: 2001:718:2601:258:b9af:be6:86c1:af1f...–
peter
~ Anonymní uživatel
3984 příspěvků
31. 5. 2024   #6
-
0
-

   

....A1----A2
........B1----B2     (B1<A2<B2)
..C1----C2           (C1<A1<C2)
......D1-D2          (A1>D1 and D2<A2)
E1------------E2 - jeste tenhle pripad jsem zapomnel
Nahlásit jako SPAM
IP: 2001:718:2601:258:b9af:be6:86c1:af1f...–
JerryM0
Věrný člen
31. 5. 2024   #7
-
0
-

#1 David
v SQL se datumy dají porovnat

https://www.geeksforgeeks.org/sql-query-to-compare-two-dates/

takže si napíšeš proceduru (nebo funkci) která bude mít 4 vstupní parametry a první dva budou začátek a konec prvního intervalu a druhé dva budou začátek a konec druhého intervalu a uvnitř funkce/procedury je porovnáš....

případně mužeš interval převézt na juliánské datum a porovnávat to v tom ale výsledek je stejný

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:d12:e48b:ea0a:aab5...–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý