Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ketersediaan pemesanan MySQL, rentang tanggal yang tumpang tindih

  1. Buat daftar semua batas pemesanan (yaitu tanggal mulai dan berakhir) yang terjadi pada periode yang diinginkan:

      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. Tambahkan ke batas yang terjadi segera sebelum periode yang diinginkan:

    -- [ 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. Buat gabungan luar antara hasil ini dan bookings tabel, menjaga semua batasan tetapi hanya menyertakan pemesanan jika berkontribusi pada jumlah orang secara bersamaan setelah batas:

    FROM bookings RIGHT JOIN (
      -- [ from part 2 above ]
    ) t ON date_start <= boundary AND boundary < date_end
    
  4. Jumlahkan jumlah orang di setiap batas:

    SELECT IFNULL(SUM(quantity),0) AS simultaneous_people
    -- [ from part 3 above ]
    GROUP BY boundary
    
  5. Temukan maksimum dan minimum:

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

Menyatukan semuanya:

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

Lihat di 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. Apa cara tercepat untuk mengimpor cadangan database mysql yang besar?

  2. Panggil ke fungsi yang tidak ditentukan session_register()

  3. PHP MySQL Query Dimana x =$variable

  4. Membandingkan baris dalam tabel untuk perbedaan antar bidang

  5. CHAR() Contoh di MySQL