[PHP/MySQL]Event selecteren binnen tijdgrens

Pagina: 1
Acties:
  • 886 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Hallo allemaal,

Het is een beetje een cryptische titel, maar ik ga het uitleggen. Ik ben bezog met het maken van een urenregistratie programma die via een kalender interface(denk aan Outlook) werkt. Nu werkt dit wel prima zolang de registratie binnen één dag valt, dus op 9-11-2007, dat krijg ik er perfect uit en weergegeven.

Het probleem is alleen dat ik met mijn huidige query niet de registraties er uit krijg die doorlopen naar de volgende dag. Dus registratie begint om: 8-11-2007 15:00:00 en eindigt om 9-11-2007 03:00:00. Ik krijg die niet uit de database. Dat is ook logisch met deze query:

MySQL:
1
2
3
4
5
6
# $dtGiven is een functie parameter die datum geeft als: 2007-11-09

$sQuery = "SELECT iRegID
         FROM   tblRegistration
         WHERE  dtBegin >= '" . $dtGiven . " 00:00:00'
         AND  dtEnd   <= '" . $dtGiven . " 23:59:59'";


Mijn vraag is dan ook, hoe maak ik hier wel een nette query van? Als ik dtEnd altijd met een dag verhoogt, krijg ik ook de registraties van de volgende dag en dat wil je ook niet. Ik kom zelf niet tot een mooie oplossing en kom hier hulp zoeken.

Alvast bedankt voor je hulp!

Acties:
  • 0 Henk 'm!

Verwijderd

Wat voor data type gebruik je om je data in op te slaan? Als je met timestamps gaat werken kun je heel mooi binnen een bepaald tijdsbestek werken.

Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Ik werk nu met DATETIME datatype van MySQL.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Het probleem zit hem in de query en niet in het gebruikt data type. Je moet je query zo schrijven zodat je alle items krijgt die de begindatum in die dag hebben OF hun eind datum in die dag.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

- klopt niet -

[ Voor 96% gewijzigd door Verwijderd op 09-11-2007 11:22 ]


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Creepy schreef op vrijdag 09 november 2007 @ 11:18:
Het probleem zit hem in de query en niet in het gebruikt data type. Je moet je query zo schrijven zodat je alle items krijgt die de begindatum in die dag hebben OF hun eind datum in die dag.
En dan mis je alleen nog de events met een begindatum voor die dan en een einddatum na die dag. Dat is uiteraard met een extra clausule in het WHERE-gedeelte van je query makkelijk toe te voegen.

petersmit.eu


Acties:
  • 0 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
Wil je niet gewoon alle registraties die op een bepaalde dag beginnen, waarbij het niet uitmaakt wanneer ze exact eindigen?

Kortom:
code:
1
2
3
4
$sQuery = "SELECT iRegID
         FROM   tblRegistration
         WHERE  dtBegin >= '" . $dtGiven . " 00:00:00'
         AND  dtBegin   <= '" . $dtGiven . " 23:59:59'";


Overigens zijn er speciale functies voor het werken met het datetime type die je kunnen helpen. Bijvoorbeeld http://dev.mysql.com/doc/...tions.html#function_date:

code:
1
2
3
$sQuery = "SELECT iRegID
         FROM   tblRegistration
         WHERE  DATE(dtBegin) = '$dtGiven';"


Deze functies kunnen je ook helpen bij het bepalen van het verschil tussen dtEnd en dtBegin.

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

phsmit schreef op vrijdag 09 november 2007 @ 11:21:
[...]
En dan mis je alleen nog de events met een begindatum voor die dan en een einddatum na die dag. Dat is uiteraard met een extra clausule in het WHERE-gedeelte van je query makkelijk toe te voegen.
Uiteraard ;)

Let er wel op dat een
code:
1
WHERE  DATE(dtBegin) = '$dtGiven';"

geen index kan gebruiken terwijl dat met een
code:
1
WHERE  dtBegin >= '" . $dtGiven . " 00:00:00'

wel kan.

[ Voor 47% gewijzigd door Creepy op 09-11-2007 11:29 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Dus als ik het goed begrijp en nu goed heb uitgevoerd, stellen jullie dit voor:

code:
1
2
3
4
$sQuery = "SELECT iRegID
         FROM   tblRegistration
         WHERE  DATE(dtBegin) = '" . $dtGiven ."'
        OR   DATE(dtEnd) = '" . $dtGiven . "'";


en dan in de PHP code met tijden de lengtes van de table uitrekenen... op zich wel weer heel simpel eigenlijk.

Dank u allen!

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dezelfde vraag al zeker 5x beantwoord afgelopen jaar, dus ik quote mezelf maar. :Y)
Voutloos schreef op vrijdag 18 mei 2007 @ 21:56:
Begindatum moet kleiner zijn dan het einde van de periode EN einddatum moet groter zijn dan het begin van de periode. Dit klinkt misschien wat tegenintuitief, maar teken het anders maar, dit is gewoon dé oplossing. :Y)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

voutloos geeft al de perfecte oplossing..

dit even voorgekouwt in mysql

PHP:
1
2
3
4
$sQuery = "SELECT iRegID
         FROM   tblRegistration
         WHERE  dtBegin <= '" . $dtGiven . " 23:59:59'
         AND  dtEnd   >= '" . $dtGiven . " 00:00:00' ";
Pagina: 1