2009-07-13 10 views
0

J'essaie d'écrire une instruction SQL qui compare les plages de temps. Je suis d'excellentes idées de cette question:Comparaison des plages horaires

Comparing date ranges

Le problème est cependant temps que minuit par exemple enjambent étant donné les suivantes début et de fin:

  • 19:00 - 20:00
  • 21h00-21h30
  • 23:00-01:00
  • 01:00 - 03: 00

Je veux trouver toutes les lignes où les heures croisent/chevauchent 23:30 - 00:30. Le code que j'ai ne fonctionne que si les deux lignes dans la base de données et la plage de temps que je veux vérifier commencent et se terminent le même jour.

J'ai essayé de convertir les heures en secondes depuis minuit, puis en ajoutant 86400 secondes à l'heure de fin si la plage s'étend sur minuit. J'ai eu un succès limité avec ça, mais il manque encore quelques gammes qui se chevauchent.

+0

quel type de sql utilisez-vous? postgre? mysql? t-sql? – Peter

+0

C'est mysql mais j'aimerais vraiment en savoir plus sur les maths impliqués aussi. –

Répondre

0

Voici la réponse dans SQL Server - MySQL serait similaire

DECLARE @StartTime TIME, @EndTime TIME, @CheckTime TIME 
SET @StartTime = '20:00' 
SET @EndTime = '06:00' 
SET @CheckTime = '22:59' 

IF @StartTime <= @EndTime 
BEGIN 
    --same day eg 6pm - 11pm 
    IF @CheckTime >= @StartTime AND @CheckTime <= @EndTime 
     SELECT 'True' 
    ELSE 
     SELECT 'False' 
END 
ELSE 
BEGIN 
    --overlaps midnight 
    IF @CheckTime >= @EndTime OR @CheckTime <= @StartTime 
     SELECT 'true' 
    ELSE 
     SELECT 'false' 
END 
Questions connexes