Toon posts:

[sql] query vraagje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Vrij gecompliceerd uit te leggen dit. Toch proberen.

Ik ben bezig om een agenda te maken voor een reserveer applicatie.
Ik laat de agenda per maand zien:

Afbeeldingslocatie: http://www.streamingmediadesign.nl/got/gotAgenda.png
*klik*

(Ik heb voor dit topic even de timestamps laten zien bij de dagen.)
De kalendermaand laten zien is geen enkel probleem.

Echter; er kunnen opties in de agenda worden gezet (deze staan in een apparte tabel met de volgende velden: id, persoonID, omschrijving, begin, eind. Waarbij 'begin' en 'eind' timestamp velden zijn (INT, 10).).
Een optie is niets anders dan een afsprak, met een begin en een eind datum.

Dan lijkt het in eerste instantie vrij simpel om de opties van deze maand te selecteren:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// year = 2004, month = 3 & month_end = 31 in dit geval...
$sql ="
      SELECT
            id,
            omschrijving,
            begin,
            eind
      FROM
            tb_options
      WHERE
            persoonID = '" . $_SESSION['persoon'] . "'
      AND
            begin >= " . mktime('', '', '', $month, 1, $year) . "
      AND
            eind <= " . mktime('', '', '', $month, $month_end, $year) . "
      ORDER BY
            begin ASC
      ";


Echter dit gaat niet op, want:
Hij moet ook de opties selecteren die bijvoorbeeld in februari beginnen en ergens in maart eindigen, en andersom: opties die in maart beginnen en ergens in april eindigen. Iets wat niet gebeurd met bovenstaande query.

Dus ik logisch nadenken:
"als:
of de eindtijd groter is de eerste dag EN de eindtijd is kleiner dan de laatste dag
of
de begintijd is groter dan de eerste dag EN de begintijd is kleiner dan de laaste dag"
dan heb ik alle opties die (gedeeltelijk) in de maand maart vallen.
Echter bedenk ik me tijdens het typen dat dit niet opgaat voor opties die beginnen in februari en eindigen in april!

Al met al; zou iemand mij op weg kunnen helpen al dan niet pseudo? Ik mis even de logica die er ongetwijfeld voor te vinden is.

Wat ik al had; maar iets wat niet (wel gedeeltelijk geloof ik) lijkt te werken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$sql ="
      SELECT
            id,
            omschrijving,
            begin,
            eind
      FROM
            tb_options
      WHERE
            persoonID = '" . $_SESSION['persoon'] . "'
      AND
            (
             (
                 eind >= " . mktime('', '', '', $month, 1, $year) . "
             AND eind <= " . mktime('', '', '', $month, $month_end, $year) . "
             ) OR 
             (
                 begin >= " . mktime('', '', '', $month, 1, $year) . "
             AND begin <= " . mktime('', '', '', $month, $month_end, $year) . "
             )
            )
      ORDER BY
            begin ASC
      ";


Nogmaals; ik mis het even.

[ Voor 18% gewijzigd door Verwijderd op 23-03-2004 21:15 ]


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
SQL:
1
2
WHERE datum_begin BETWEEN eerstedagv/dmaand AND laatstedagv/dmaand
  OR datum_eind BETWEEN eerstdagv/dmaand AND laatstedagv/dmaand


zou ze volgens mij allemaal moeten pakken...

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

of de begin tijd ligt in de maand of de eindtijd ligt in de maand, waar bij in de maand betekent >eerste dag en <laatste dag

ik tik te langzaam ;)

[ Voor 13% gewijzigd door Verwijderd op 23-03-2004 21:21 ]


Verwijderd

Topicstarter
Top, ik ben al aardig op weg.
Zoals ik zelf zei, het kan natuurlijk ook zo zijn dat een afspraak begint in februari en eindigt in april.
Maar dit is iets toevoegen als:

code:
1
OR begin < begin_maand AND eind > eind_maand

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Verwijderd schreef op 23 maart 2004 @ 21:23:
Top, ik ben al aardig op weg.
Zoals ik zelf zei, het kan natuurlijk ook zo zijn dat een afspraak begint in februari en eindigt in april.
Maar dit is iets toevoegen als:

code:
1
OR begin < begin_maand AND eind > eind_maand
Waarom gebruik je nou geen between :?

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

Topicstarter
faabman schreef op 23 maart 2004 @ 21:24:
[...]


Waarom gebruik je nou geen between :?
klopt klopt klopt, ik ging even te snel :+

edit, voor de liefhebber:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      $SelectQuery = "
                     SELECT
                           id,
                           omschrijving,
                           begin,
                           eind
                     FROM
                           tb_options
                     WHERE
                           persoonID = '" . $_SESSION['persoon'] . "'
                     AND
                           (
                           (begin BETWEEN ".$dagEerste." AND ".$dagLaatste.")
                     OR
                           (eind BETWEEN ".$dagEerste." AND ".$dagLaatste.")
                     OR
                           (begin < ".$dagEerste." AND eind > ".$dagLaatste.")
                           )
                     ORDER BY
                           begin ASC
                     ";

[ Voor 70% gewijzigd door Verwijderd op 23-03-2004 22:02 ]


Verwijderd

Of, nog simpeler:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
      $SelectQuery = " 
                     SELECT 
                           id, 
                           omschrijving, 
                           begin, 
                           eind 
                     FROM 
                           tb_options 
                     WHERE 
                           persoonID = '" . $_SESSION['persoon'] . "' 
                     AND 
                          begin <= ".$dagLaatste."
                     AND 
                          eind >= ".$dagEerste."
                     ORDER BY 
                           begin ASC 
                     ";
?> 


Is wat korter, en ook sneller (geen ORs).
Pagina: 1