sql >> データベース >  >> RDS >> Mysql

2つの日付範囲がmysqlで重複しているかどうかを確認するにはどうすればよいですか?

    date_startedが保証されている場合 、datefinished$DateA および$DateB NULLではなく、date_startedであることが保証されています 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`
    

    視覚的に:

          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
    

    範囲の「重複」がないことを簡単に検出できます:

    ( a > f OR b < s )
    

    そして、があるときに「true」を返すことを簡単に否定できます。 「オーバーラップ」:

    NOT ( a > f OR b < s )
    

    これをSQLに変換する:

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


    1. PostgreSQLでのtimezone()関数のしくみ

    2. インデックスの断片化の軽減

    3. mysqlのプリペアドステートメントを使用する方が、一般的なエスケープ関数を使用するよりも安全なのはなぜですか?

    4. MariaDB ROUND()とFLOOR()