Ik loop al een paar dagen tegen een probleem aan waarvan bij mij het kwartje nog niet gevallen is hoe op te lossen.
Google bood ook geen hulp.

Het gaat om het volgende:
Ik heb een table "schedules". Deze bevat in ieder geval de TIME kolommen "start" en "end". De start en end vertegenwoordigen het start en eindtijdstip van een bepaalde procedure. Werking hiervan is verder niet van belang.

Stel start is 10:00 en end is 22:00
Het tijdstip is nu 9:23. Als ik dan de query uitvoer met als filter: start<=tijdstip and end>tijdstip. Dan krijg ik zoals verwacht geen resultaat.
Is het tijdstip nu 13:14 dan krijg ik wel resultaat etc.
Dit is simpel en werkt wel. Maar ik loop tegen een probleem aan als het eindtijdstip over de nacht gaat, bijvoorbeeld: start is 22:00 en end is 02:00.
Nu werkt de filter start<=tijdstip and end>tijdstip niet meer. Want als het 23:11 is dan is start inderdaad kleiner maar hij ziet end natuurlijk ook als kleiner. Dus krijg ik geen resultaat.

Wie kan mij op weg helpen om hier toch mee om te kunnen gaan?
is dit een dagelijks schema, of is er ook een datum bij betrokken?

in dat laatste geval zou je 2015-10-15 22:00:00 en 2015-10-16 04:00 moeten opslaan
Ik denk dat je moet werken met het Datetime object. En deze ook in de database op te slaan als datetime.
Ookal gebruik je de datum niet php kan deze wel gebruiken om bijvoorbeeld tijden te zoeken in de toekomst of verleden.
werkt dit voor het eerste geval?

SELECT *
FROM tabel
WHERE NOW() BETWEEN starttijd AND eindtijd
OR (TIMEDIFF(starttijd, eindtijd) < 0 AND NOW() BETWEEN eindtijd AND starttijd);


ik denk bij nader inzien dat de laatste between weg mag
Het bereik van het TIME-type loopt van '-838:59:59' tot en met '838:59:59'. Als je geen datums kunt/wilt opslaan (wat ook mijn voorkeur zou hebben), dan kun je daarmee de starttijd plus de duur in plaats van de eindtijd opslaan.
Iets als:

(start<=tijdstip and end>tijdstip)
or
(end<start and (start<=tijdstip or end>tijdstip))

?
Het werken met een datum heeft niet mijn voorkeur. Als ik dagelijks op bepaalde tijden de procedure wil laten uitvoeren dan zou ik tot in eeuwigheid de tijden met datum moeten gaan vullen. Vandaar dat het een TIME veld is.

@Ward, Ik snap gedeeltelijk wat je bedoeld. Zou je die iets meer toe kunnen lichten?
Je hebt de volgende logische relatie:

starttijd + duur = eindtijd

Met zo'n formule met twee bekenden kun je altijd de derde onbekende afleiden, want:

• eindtijd = starttijd + duur
• starttijd = eindtijd - duur
• duur = eindtijd - starttijd

Daarmee kun je het probleem dus omdenken. Je kunt een TIME-veld namelijk niet alleen gebruiken om een vast tijdstip op te slaan, maar ook voor een tijdsduur in uren-minuten-seconden. Sla je bijvoorbeeld de starttijd 23:11:00 op en een duur van 2:00:00 voor 2 uur, dan wordt de eindtijd 25:11:00. Vervolgens hoef je alleen de weergave aan te passen, volgens een eenvoudige logica: alles groter dan 24 uur is na middernacht dus morgen (of overmorgen, of overovermorgen, enzovoort).
Top dank je Ward. Hier ga ik wel uitkomen.
Voortbordurend op qat Ivo aangaf

SELECT *
FROM tabel
WHERE 
    (eindtijd >= starttijd and NOW() BETWEEN starttijd AND eindtijd)
OR
    (eindtijd < starttijd and ( NOW() >= starttijd OR NOW() <= eindtijd ) )
;
Bedankt voor de tips!

Reageren