2 votes

Blocage mental SQL - vérifier si une période de temps en chevauche une autre

J'ai quatre fois unix. Deux correspondent au début et à la fin du jour (quel qu'il soit) - c'est-à-dire 00:00:00 et 23:59:59 - et les deux autres sont des heures choisies par l'utilisateur.

J'ai besoin d'une requête (compatible avec TSQL) pour vérifier si la période entre les heures "aujourd'hui" chevauche les heures de l'utilisateur. Quelqu'un peut-il m'aider ?

5voto

bendataclear Points 2279

Je l'ai mis dans un document txt pour m'en souvenir (dyslexie de la date) :

Intersects :

Date Range 1   |         |>----------------------<|
Date Range 2   |                 |>------------------------<|

where Range1Start <= Range2End and Range1End >= Range2Start

La plage 1 dans la plage 2 :

Date Range 1   |                   |>-------------<|
Date Range 2   |                 |>------------------------<|

where Range1Start >= Range2Start and Range1End <= Range2End

Plage 2 dans la plage 1 :

Date Range 1   |         |>----------------------<|
Date Range 2   |                 |>-------------<|

where Range2Start >= Range1Start and Range2End <= Range1End

3voto

Mikael Eriksson Points 77190
where UserStart <= TodayEnd and
      UserEnd >= TodayStart

0voto

Robert K Points 130

Je sais que ce post est ancien mais je pense que la réponse acceptée est incomplète. Il doit y avoir au moins un autre cas d'intersection et modifier ce qui précède.

INTERSECTION (FIXE)

Date Range 1   |         |>----------------------<|
Date Range 2   |                 |>------------------------<|
WHERE Range1Start <= Range2Start AND Range1End <= Range2End AND Range1End>=Range2Start

Cette correction permet d'éviter de détecter l'intervalle 2 dans l'intervalle 1 comme une intersection (ce qui est le résultat de la requête dans la solution acceptée).

Les deux suivants sont corrects mais ne sont pas bien illustrés

Plage 1 dans Plage 2

Date Range 1   |                      |>-------------<|
Date Range 2   |                 |>------------------------<|

Date Range 1   |                 |>------------------------<|
Date Range 2   |                 |>------------------------<|

WHERE Range1Start >= Range2Start AND Range1End <= Range2End 

Plage 2 dans la plage 1 :

Date Range 1   |         |>------------------------<|
Date Range 2   |               |>-------------<|

Date Range 1   |         |>------------------------<|
Date Range 2   |         |>------------------------<|

WHERE Range2Start >= Range1Start AND Range2End <= Range1End

Et enfin la deuxième intersection

INTERSECTION (DROITE)

Date Range 1   |                |>----------------------<|
Date Range 2   |       |>------------------------<|
WHERE Range2Start <= Range1Start AND Range2End <= Range1End AND Range1Start <=Range2End

En fonction de ce dont vous avez besoin, je suggérerais de ne pas utiliser plus grand que (>=) et moins que (<=), car vous supposez également que les périodes égales sont dans ces groupes, mais c'est à vous de décider.

EQUALS RANGES

Date Range 1   |         |>------------------------<|
Date Range 2   |         |>------------------------<|

WHERE Range1Start = Range2Start AND Range1End = Range2End

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X