Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como verificar se dois intervalos de datas se sobrepõem no mysql?


Se tivermos a garantia de que date_started , datefinished , $DateA e $DateB não são NULL, e temos a garantia de que date_started não é maior que 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`

Visualmente:
      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

Podemos detectar facilmente quando não há "sobreposição" dos intervalos:
( a > f OR b < s )

E podemos facilmente negar isso para retornar "true" quando existir uma "sobreposição":
NOT ( a > f OR b < s )

Convertendo isso para SQL:
NOT ( GREATEST('{$dateA}','{$dateB}') < p.date_started
      OR LEAST('{$dateA}','{$dateB}') > p.date_finished
    )