login  Naam:   Wachtwoord: 
Registreer je!
 Forum

SQL Between dates

Offline roy - 02/10/2009 09:16
Avatar van royPHP gevorderde Beste,

Ik ben bezig met het maken van een planner. Voordat ik een taak ga inserten in de database wil ik checken of er al iets gepland staat, dit om dubbele afspraken te voorkomen.

Dus ik heb de volgende gegevens:
startdate: 1-10-2009
start time: 21:06
duration (in uur): 2

Hoe kan ik checken of er tussen 1-10-2009 21:06 en 1-10-2009 23:06 al iets gepland staat?


Ik hoop dat iemand een oplossing kan bieden.

Met vriendelijke groeten,
Roy

13 antwoorden

Gesponsorde links
Offline ArieMedia - 02/10/2009 09:32
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
http://www.rose...time.shtml

Denk dat je daar wel wat aan hebt..
lang leve google...
Offline roy - 02/10/2009 09:42
Avatar van roy PHP gevorderde Ok,,, maar er wordt zo geen rekening gehouden met de duration (de duur van de task..

Hoe kan ik er ook voor zorgen dat hiermee rekening wordt gehouden??

~
Roy
Offline ArieMedia - 02/10/2009 09:52
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
  1. SELECT *
  2. FROM auth_users
  3. WHERE lastseen
  4. BETWEEN '2009-9-11 15:23:00'
  5. AND '2009-9-11 16:00:00'


levert bij mij 1 record op, en dat klopt ook want tussen die tijd is bij mij iemand online geweest.
Dus bij jou word de SQL:

  1. SELECT *
  2. FROM db
  3. WHERE afspraak
  4. BETWEEN '2009-10-1 21:06:00'
  5. AND '2009-10-1 23:06:00'
Offline roy - 02/10/2009 09:54
Avatar van roy PHP gevorderde hoe moet ik ermee omgaan als de start dateTime = 2009-10-1 23:06 en de duration 2 uur??

Want dan kom je ook uit op een nieuwe datum.. Hoe kan ik hiermee omgaan?


~~
Roy
Offline ArieMedia - 02/10/2009 10:01
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
roy schreef:
hoe moet ik ermee omgaan als de start dateTime = 2009-10-1 23:06 en de duration 2 uur??

Want dan kom je ook uit op een nieuwe datum.. Hoe kan ik hiermee omgaan?


~~
Roy
Met PHP afvangen he. Als de duration 2 uur is word de nieuwe datum 2009-10-2 01:06:00.
Het kan met de phpfunctie PHP.net: mktime

  1. '<?php
  2. $iJaar = 2009;
  3. $iMaand = 10;
  4. $iDag = 1;
  5. $iUur = 23;
  6. $iMin = 6;
  7. $iDuration = 7200; // in seconden
  8.  
  9. $iUnixTijd = mktime($iUur, $iMin, 0, $iMaand, $iDag, $iJaar);
  10. $iUnixTijdNieuw = $iUnixTijd + $iDuration;
  11.  
  12. $iTijdNieuw = date('Y-m-d H:i:s', $iUnixTijdNieuw);
  13.  
  14. ?>


(untested)
Offline roy - 02/10/2009 10:09
Avatar van roy PHP gevorderde Ik heb een calenderscript in javascript die de datum in een textfield zet. op deze manier: 14-10-09

Hoe kan ik dan day, maand, jaar eruit filteren? is daar een speciale functie voor?


~~
Roy
Offline ArieMedia - 02/10/2009 10:13
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
roy schreef:
Ik heb een calenderscript in javascript die de datum in een textfield zet. op deze manier: 14-10-09

Hoe kan ik dan day, maand, jaar eruit filteren? is daar een speciale functie voor?


~~
Roy

  1. $dDatum = $_POST['datum'];
  2. $aDatum = explode('-', $dDatum);
  3. $iDag = $aDatum[0];
  4. $iMaand = $aDatum[1];
  5. $iJaar = (int) '20'.$aDatum[2];
Offline roy - 02/10/2009 12:06
Avatar van roy PHP gevorderde In de database heb ik twee kolommen: start en eind...
De nieuwe Task mag daar niet tussen vallen.

Hoe is dat op te lossen???
Offline ArieMedia - 02/10/2009 12:27
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
roy schreef:
In de database heb ik twee kolommen: start en eind...
De nieuwe Task mag daar niet tussen vallen.

Hoe is dat op te lossen???
Deze keer ga ik je de code niet voorkauwen omdat ik je de middelen al heb aangeboden om een degelijke SQL-query op te bouwen.

Als je de SQL opbouwt die ik hier heb gegeven dan zal je wel of geen record terugkrijgen.

via PHP.net: mysql_num_rows weet jij hoeveel records er zijn gevonden. Als je 0 records hebt gevonden mag er een nieuwe afspraak worden gemaakt. anders niet
Offline Gerard - 02/10/2009 12:31 (laatste wijziging 02/10/2009 12:33)
Avatar van Gerard Ouwe rakker Dat kan ik je melden dat de door jou aangeboden query helaas niet zal voldoen. Je gaat er met je query namelijk vanuit dat een afspraak maar 1 moment heeft, en houdt geen rekening met de lengte van de afspraak.

Als ik in de door jou aangeleverde query een afspraak heb staan met een waarde in het veld `afspraak` van '2009-10-1 21:10:00', dan krijg ik inderdaad een COUNT van 1 terug. Maar wat nou als ik dit heb:
`afspraak_start` = '2009-10-1 21:00:00'
`afspraak_end` = '2009-10-1 23:00:00'

Of

`afspraak` = '2009-10-1 21:00:00'
`tijdsduur` = '02:00:00'

Hoe dien ik er dan mee om te gaan? Hij zal namelijk in jouw query niet matchen, omdat de datum in het veld niet binnen de door jou gestelde range ligt. Maar er is op dat moment dus wel degelijk al een afspraak.

@roy
Kun jij even een .sql ergens uploaden, of plaatsen op plaatscode, met daarin de CREATE TABLE en de INSERT statements voor de betreffende tabel? Op die manier kunnen mensen hier eenvoudig even zelf wat testen. Ik zou het jammer vinden als ik 45 minuten bezig ben met een oplossing voor je, om erachter te komen dat jouw database anders is en het daarom niet zal werken.
Offline roy - 02/10/2009 12:47
Avatar van roy PHP gevorderde
CREATE TABLE IF NOT EXISTS `scheduler_task` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`begin_date_time` varchar(255) NOT NULL,
`end_date_time` varchar(255) NOT NULL,
`duration` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Dumping data for table `scheduler_task`
--

INSERT INTO `scheduler_task` (`id`, `name`, `begin_date_time`, `end_date_time`, `duration`) VALUES
(1, 'test', '2-10-09 04:01', '2-10-09 05:01', 1),
(2, 'tester', '2-10-09 12:10', '2-10-09 01:10', 1);


SQL statement
  1. <?php
  2. $sQuery = "SELECT
  3. *
  4. FROM
  5. scheduler_task
  6. WHERE
  7. date_time BETWEEN '$begin' AND '$eind'
  8. ";
  9. ?>



Thanks,
Roy
Offline ArieMedia - 02/10/2009 12:51 (laatste wijziging 02/10/2009 12:53)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Gerard schreef:
Dat kan ik je melden dat de door jou aangeboden query helaas niet zal voldoen. Je gaat er met je query namelijk vanuit dat een afspraak maar 1 moment heeft, en houdt geen rekening met de lengte van de afspraak.

Als ik in de door jou aangeleverde query een afspraak heb staan met een waarde in het veld `afspraak` van '2009-10-1 21:10:00', dan krijg ik inderdaad een COUNT van 1 terug. Maar wat nou als ik dit heb:
`afspraak_start` = '2009-10-1 21:00:00'
`afspraak_end` = '2009-10-1 23:00:00'

Of

`afspraak` = '2009-10-1 21:00:00'
`tijdsduur` = '02:00:00'

Hoe dien ik er dan mee om te gaan? Hij zal namelijk in jouw query niet matchen, omdat de datum in het veld niet binnen de door jou gestelde range ligt. Maar er is op dat moment dus wel degelijk al een afspraak.
Je slaat de duur van de afspraak ook niet op. Je slaat op wanneer de afspraak is afgelopen. (dus net zoals de begin tijd, alleen dan 2 uur later).

Ik laat PHP de 2 timestamp van 2 uur later genereren en neem deze mee naar de SQL waar ik hem ga gebruiken.

Edit: Ik snap hem denk ik al.. ik controleer maar op 1 veld terwijl je er 2 nodig hebt . Als het probleem vanavond niet opgelost is zal ik gaan kijken moet nu echt aan het werk 
Offline roy - 02/10/2009 13:01
Avatar van roy PHP gevorderde ok, thanks

ik sla de duur wel, maar als integer

~~
Roy
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.196s