sql >> Databasteknik >  >> RDS >> Mysql

Hur kontrollerar jag om två datumintervall överlappar varandra i mysql?

Om vi ​​är garanterade att date_started , datefinished , $DateA och $DateB är inte NULL, och vi är garanterade att date_started är inte större än 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`

Visuellt:

      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 enkelt upptäcka när det inte finns någon "överlappning" av intervallen:

( a > f OR b < s )

Och vi kan lätt förneka det för att returnera "sant" när det finns en "överlappning":

NOT ( a > f OR b < s )

Konvertera det till SQL:

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


  1. Enkla citattecken, Dubbla citattecken och Backticks i MySQL

  2. hur man använder "charset" och "encoding" i "create_engine" av SQLAlchemy (för att skapa pandas dataram)?

  3. Jag kan inte använda mysql_*-funktionerna efter att ha uppgraderat PHP

  4. Läs Isolering av engagerad ögonblicksbild