sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kontrollerer man, om to datointervaller overlapper i mysql?

Hvis vi er garanteret, at date_started , datefinished , $DateA og $DateB er ikke NULL, og vi er garanteret, at date_started er ikke større end date_finished ...

`s` represents `date_started`
`f` represents `date_finished`
`a` represents the smaller of `$DateA` and `$DateB`
`b` represents the larger of `$DateA` and `$DateB`
 

Visuelt:

s-----f overlap -----+-----+----- ------- a-b | | NO a---b | YES a-----b | YES a---------b YES a-----------b YES a---b | YES a-----b YES a-------b YES | a-b | YES | a---b YES | a-----b YES | a-b YES | | a-b NO

Vi kan nemt registrere, når der ikke er nogen "overlapning" af intervallerne:

( a > f OR b < s )
 

Og vi kan nemt afvise det for at returnere "sandt", når der er et "overlap":

NOT ( a > f OR b < s )
 

Konvertering af det til SQL:

NOT ( GREATEST('{$dateA}','{$dateB}') < p.date_started
      OR LEAST('{$dateA}','{$dateB}') > p.date_finished
    )
 


  1. Sådan ændres standarddatabasens mailprofil for en bruger i SQL Server (T-SQL)

  2. Hvordan indstiller jeg standardskemaet for en bruger i MySQL

  3. Vinduesfunktioner - Løbende total med nulstilling

  4. Standardisering af PostgreSQL-sikkerhed på tværs af multi-cloud-miljøer