sql >> Database >  >> RDS >> Mysql

Hoe controleer je of twee datumbereiken elkaar overlappen in mysql?

Als we er zeker van zijn dat date_started , datefinished , $DateA en $DateB zijn niet NULL, en we zijn er zeker van dat date_started is niet groter dan 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`

Visueel:

      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

We kunnen gemakkelijk detecteren wanneer er geen "overlap" is van de bereiken:

( a > f OR b < s )

En we kunnen dat gemakkelijk ontkennen om "waar" terug te geven wanneer er is een "overlap":

NOT ( a > f OR b < s )

Dat omzetten naar SQL:

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


  1. Hoe Oracle ORDER BY en ROWNUM correct te gebruiken?

  2. Cursor in procedure die meer waarden retourneert dan query

  3. Geen geschikte driver gevonden bij het opnemen van de benodigde drivers met maven-assembly-plugin

  4. INSERT IGNORE vs INSERT ... OP DUPLICATE KEY UPDATE