Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tính khả dụng của đặt chỗ MySQL, phạm vi ngày trùng lặp

  1. Tạo danh sách tất cả các ranh giới đặt phòng (tức là ngày bắt đầu và ngày kết thúc) xảy ra trong khoảng thời gian mong muốn:

      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. Thêm vào đó là ranh giới xảy ra ngay trước khoảng thời gian mong muốn:

    -- [ 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. Thực hiện liên kết bên ngoài giữa kết quả này và bookings bảng, giữ tất cả các ranh giới nhưng chỉ bao gồm một lượt đặt chỗ nếu nó góp phần vào số lượng người đồng thời sau ranh giới:

    FROM bookings RIGHT JOIN (
      -- [ from part 2 above ]
    ) t ON date_start <= boundary AND boundary < date_end
    
  4. Tính tổng số người ở mỗi ranh giới:

    SELECT IFNULL(SUM(quantity),0) AS simultaneous_people
    -- [ from part 3 above ]
    GROUP BY boundary
    
  5. Tìm giá trị tối đa và tối thiểu:

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

Kết hợp tất cả lại với nhau:

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

Xem nó trên sqlfiddle .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PreparedStatement:Tôi có thể cung cấp tên cột làm tham số không?

  2. Nó không chèn các giá trị trong cơ sở dữ liệu

  3. Nhận thông báo SQLEXCEPTION trong các thủ tục MySQL

  4. Thông báo khi ai đó tải video lên

  5. mysql ném cột không xác định 'mac' trong 'danh sách trường'