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

MySQLの予約可能性、重複する日付範囲

    1. 希望する期間に発生するすべての予約境界(つまり、開始日と終了日)のリストを作成します。

        SELECT date_start AS boundary
        FROM   bookings
        WHERE  date_start BETWEEN @start AND @end
      UNION
        SELECT date_end
        FROM   bookings
        WHERE  date_end BETWEEN @start AND @end
      
    2. それに加えて、希望する期間の直前に発生する境界:

      -- [ from part 1 above ]
      UNION
        SELECT MAX(boundary)
        FROM (
          SELECT MAX(date_start) AS boundary
          FROM   bookings
          WHERE  date_start <= @start
        UNION ALL
          SELECT MAX(date_end)
          FROM   bookings
          WHERE  date_end <= @end
        ) t
      
    3. この結果とbookingsを外部結合します テーブル、すべての境界を保持しますが、の同時人数に寄与する場合にのみ予約を含めます 境界:

      FROM bookings RIGHT JOIN (
        -- [ from part 2 above ]
      ) t ON date_start <= boundary AND boundary < date_end
      
    4. 各境界の人数を合計します:

      SELECT IFNULL(SUM(quantity),0) AS simultaneous_people
      -- [ from part 3 above ]
      GROUP BY boundary
      
    5. 最大値と最小値を見つける:

      SELECT MIN(simultaneous_people),
             MAX(simultaneous_people)
      FROM (
        -- [ from part 4 above ]
      ) t
      

    すべてをまとめる:

    SELECT MIN(simultaneous_people),
           MAX(simultaneous_people)
    FROM (
      SELECT IFNULL(SUM(quantity),0) AS simultaneous_people
      FROM   bookings RIGHT JOIN (
        SELECT date_start AS boundary
        FROM   bookings
        WHERE  date_start BETWEEN @start AND @end
      UNION
        SELECT date_end
        FROM   bookings
        WHERE  date_end BETWEEN @start AND @end
      UNION
        SELECT MAX(boundary)
        FROM (
          SELECT MAX(date_start) AS boundary
          FROM   bookings
          WHERE  date_start <= @start
        UNION ALL
          SELECT MAX(date_end)
          FROM   bookings
          WHERE  date_end <= @end
        ) t
      ) t ON date_start <= boundary AND boundary < date_end
      GROUP BY boundary
    ) t
    

    sqlfiddle でご覧ください 。



    1. MySQLトランザクションでコミットされていない書き込みがあるかどうかを確認するにはどうすればよいですか?

    2. 日付範囲が存在することを確認するにはどうすればよいですか

    3. herokuで.sqlスクリプトを実行する方法は?

    4. Jbossmysql-jdbcに適したドライバーが見つかりません