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

PHP / MySQL:Lập mô hình các sự kiện lặp lại trong cơ sở dữ liệu nhưng truy vấn phạm vi ngày

Tôi sẽ tạo một bảng kiểm đếm chỉ với một cột có tên là id và điền vào bảng đó với các số từ 0 đến 500. Giờ đây, chúng tôi dễ dàng sử dụng nó để thực hiện các lựa chọn thay vì sử dụng vòng lặp while.

Id
-------------------------------------
0
1
2
etc...

Sau đó, tôi sẽ lưu trữ các sự kiện trong một bảng với Name as varchar , startdate as datetimerepeats as int

Name    | StartDate            |   Repeats
-------------------------------------
Meeting | 2012-12-10 00:00:00  |   7
Lunch   | 2012-12-10 00:00:00  |   1

Bây giờ chúng ta có thể sử dụng bảng kiểm đếm để chọn tất cả các ngày giữa hai ngày bằng cách sử dụng:

SELECT DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY) as showdate
FROM `tally`
WHERE (DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY)<='2012-12-20 00:00:00')
ORDER BY Id ASC
ShowDate
-------------------------------------
2012-12-09 00:00:00
2012-12-10 00:00:00
2012-12-11 00:00:00
2012-12-12 00:00:00
2012-12-13 00:00:00
2012-12-14 00:00:00
2012-12-15 00:00:00
2012-12-16 00:00:00
2012-12-17 00:00:00
2012-12-18 00:00:00
2012-12-19 00:00:00
2012-12-20 00:00:00

Sau đó, chúng tôi kết hợp điều này trên bảng sự kiện để tính toán sự khác biệt giữa ngày bắt đầu và ngày chiếu. Chúng tôi đã đưa ra kết quả của việc này bằng các repeats và nếu phần còn lại là 0 , chúng tôi phù hợp.

Tất cả kết hợp trở thành:

SELECT E.Id, E.Name, E.StartDate, E.Repeats, A.ShowDate, DATEDIFF(E.StartDate, A.ShowDate) AS diff
FROM events AS E, (
    SELECT DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY) as showdate
    FROM `tally`
    WHERE (DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY)<='2012-12-20 00:00:00')
    ORDER BY Id ASC
) a
WHERE MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats)=0
AND A.ShowDate>=E.StartDate

Kết quả là

Id  | Name       |StartDate             | Repeats   | ShowDate              | diff
---------------------------------------------------------------------------------
1   | Meeting    | 2012-12-10 00:00:00  | 7         | 2012-12-10 00:00:00   | 0
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-10 00:00:00   | 0
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-11 00:00:00   | -1
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-12 00:00:00   | -2
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-13 00:00:00   | -3
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-14 00:00:00   | -4
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-15 00:00:00   | -5
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-16 00:00:00   | -6
1   | Meeting    | 2012-12-10 00:00:00  | 7         | 2012-12-17 00:00:00   | -7
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-17 00:00:00   | -7
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-18 00:00:00   | -8
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-19 00:00:00   | -9
2   | Lunch      | 2012-12-10 00:00:00  | 1         | 2012-12-20 00:00:00   | -10

Bây giờ bạn có thể (và nên làm!) Tăng tốc mọi thứ. Ví dụ:bằng cách lưu trữ trực tiếp ngày tháng trong bảng để bạn có thể chọn trực tiếp tất cả các ngày thay vì sử dụng bảng kiểm đếm với dateadd. Mọi thứ bạn có thể lưu vào bộ nhớ cache và không phải tính toán lại đều tốt.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết kế cơ sở dữ liệu quy tắc giá cho hệ thống đặt phòng khách sạn

  2. Ví dụ về DATE_ADD () - MySQL

  3. SQLSTATE [23000]:Vi phạm ràng buộc toàn vẹn:1217

  4. Dòng lệnh MySQL và các giao dịch

  5. Cách định dạng chuỗi mệnh đề SQL IN với Python