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

Làm cách nào để so sánh các giá trị chồng chéo trong một hàng?

Shahkalpesh đã trả lời câu hỏi bằng:

Tôi đã đăng một nhận xét mà tôi cho rằng điều này là sai, đưa ra một số ví dụ ngược lại:

Để trả lời nhận xét của tôi, Shahkalpesh đã yêu cầu:

Đủ công bằng - có. Đã chỉnh sửa một chút, câu hỏi cho biết:

  • từ 7 giờ sáng đến 1 giờ chiều hoặc
  • từ 9 giờ sáng đến 1 giờ chiều hoặc
  • từ 9 giờ sáng đến 5 giờ chiều.

Đủ nền. Chúng ta có thể bỏ qua ngày của các cuộc hẹn, và chỉ xem xét thời gian. Tôi giả định rằng có một cách dễ dàng để giới hạn thời gian được ghi ở định dạng hh:mm; không phải tất cả DBMS đều thực sự cung cấp điều đó, nhưng phần mở rộng để xử lý hh:mm:ss là không đáng kể.

Appointments

Row     timeStart   timeEnd   Note
  1     07:00       13:00     First valid range
  2     09:00       13:00     Second valid range
  3     09:00       17:00     Third valid range
  4     14:00       17:00     First plausibly valid range
  5     05:00       06:00     First probably invalid range
  6     18:00       22:30     Second probably invalid range

Với một tìm kiếm các cuộc hẹn trùng lặp trong phạm vi 09:00 - 13:00, truy vấn (đơn giản hóa) của Shahkalpesh sẽ trở thành:

SELECT * FROM Appointments
    WHERE (timeStart >= '09:00' OR timeEnd <= '13:00')

Điều này sẽ trả về tất cả sáu hàng dữ liệu. Tuy nhiên, chỉ có hàng 1, 2, 3 trùng vào khoảng thời gian 09:00 - 13:00. Nếu các hàng 1, 2 và 3 là giá trị cuộc hẹn đại diện hợp lệ duy nhất, thì truy vấn của Shahkalpesh tạo ra câu trả lời chính xác. Tuy nhiên, nếu hàng 4 (mà tôi nghĩ là hợp lệ) được cho phép, thì không nên trả lại hàng đó. Tương tự, các hàng 5 và 6 - nếu có - sẽ không được trả lại. [ Trên thực tế, giả sử timeStart <= timeEnd đối với tất cả các hàng trong bảng (và không có giá trị NULL nào để làm rối tung mọi thứ), chúng ta có thể thấy rằng truy vấn của Shahkalpesh sẽ trả về BẤT KỲ hàng dữ liệu nào cho truy vấn 09:00-13:00 vì thời gian bắt đầu của hàng lớn hơn 09:00 hoặc thời gian kết thúc nhỏ hơn 13:00 hoặc cả hai. Điều này tương đương với việc viết 1 = 1 hoặc bất kỳ từ ngữ nào khác trong mệnh đề WHERE. ]

Nếu chúng ta coi truy vấn của ShaneD (như đã được đơn giản hóa):

SELECT * FROM Appointments
    WHERE timeStart <= '13:00' AND timeEnd >= '09:00'

chúng ta thấy rằng nó cũng chọn các hàng 1, 2 và 3, nhưng nó từ chối các hàng 4 (vì timeStart> '13:00'), 5 (vì timeEnd <'09:00 ') và 6 (vì timeStart>' 13:00 '). Biểu thức này là một ví dụ nguyên mẫu về cách chọn các hàng 'chồng chéo', đếm các hàng 'gặp nhau' và 'gặp nhau' (xem " Đại số khoảng cách của Allen ", chẳng hạn) là chồng chéo. Việc thay đổi '> =' và '<=' sẽ thay đổi tập hợp các khoảng thời gian được tính là chồng chéo.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dấu gạch dưới trong tên bảng MySQL có gây ra sự cố không?

  2. Mệnh đề SQL IN chậm hơn các truy vấn riêng lẻ

  3. Tại sao DBI thay đổi ngầm định số nguyên thành chuỗi?

  4. Cách hiển thị hình ảnh (kiểu bolb) trong trang jsp từ mySql DB trong Struts 2 bằng Hibernate

  5. Laravel - Tuyên bố chuẩn bị sẵn của PDO - Không thể thực hiện các truy vấn trong khi các truy vấn không có bộ đệm khác đang hoạt động