Tôi đang cố gắng thực hiện các sự kiện lặp lại khét tiếng trên các lịch sử dụng PHP/MySQL. Cuối cùng tôi đã tìm thấy một cái gì đó mà dường như làm việc. Tôi tìm thấy số answer here nhưng tôi gặp khó khăn khi hoàn thành nó.Lặp lại các sự kiện lịch và một số phép toán cuối cùng
Bảng 'sự kiện' đầu tiên của tôi.
ID NAME
1 Sample Event
2 Another Event
Bảng thứ hai 'events_meta lưu trữ dữ liệu lặp lại.
ID event_id meta_key meta_value
1 1 repeat_start 1336312800 /* May 7th 2012 */
2 1 repeat_interval_1 432000 /* 5 days */
Với repeat_start là ngày không có dấu thời gian và lặp lại số tiền tính bằng giây giữa các khoảng (432000 là 5 ngày).
Sau đó tôi có MySQL sau mà tôi đã sửa đổi một chút từ liên kết ở trên. Dấu thời gian được sử dụng bên dưới (1299132000 là ngày 12 tháng 5 năm 2012) là ngày hiện tại không có thời gian.
SELECT EV.*
FROM `events` EV
RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id`
RIGHT JOIN `events_meta` EM2 ON EM2.`meta_key` = CONCAT('repeat_interval_', EM1.`id`)
WHERE EM1.meta_key = 'repeat_start'
AND (
(CASE (1336744800 - EM1.`meta_value`)
WHEN 0
THEN 1
ELSE (1336744800 - EM1.`meta_value`)/EM2.`meta_value`
END
)
) = 1
Ở phía trên MySQL, đoạn code sau khấu trừ lĩnh vực repeat_start (EM1.'meta_value'
) từ ngày hiện tại và sau đó chia nó bằng khoảng sân lặp lại (EM2.'meta_value'
).
ELSE (1336744800 - EM1.`meta_value`)/EM2.`meta_value`
HOẶC
TODAYS DATE - START DATE/5 DAYS
Vì vậy, đây là toán học:
1336744800 - 1336312800 = 432000
432000/432000 = 1
Bây giờ hoạt động hoàn hảo. Nhưng nếu tôi thay đổi dấu thời gian hiện nay 5 ngày trước để 1336312800 là 17 Mat 2012, nó trông giống một chút như thế này:
1336312800 - 1336312800 = 864000
86400/432000 = 2
nào không hoạt động bởi vì nó tương đương với 2 và trong MySQL nó cần để bằng 1 Vì vậy, tôi đoán câu hỏi của tôi là, làm thế nào để tôi nhận được MySQL để nhận ra một số nguyên chứ không phải làm điều này?
...
WHERE EM1.meta_key = 'repeat_start'
AND (
(CASE (1336744800 - EM1.`meta_value`)
WHEN 0
THEN 1
ELSE (1336744800 - EM1.`meta_value`)/EM2.`meta_value`
END
)
) = IN (1,2,3,4,5,6,7,8,....)
Hy vọng tôi có ý nghĩa và tôi hy vọng nó chỉ là một phép toán đơn giản hoặc một chức năng mà MySQL có thể trợ giúp :) Cảm ơn sự giúp đỡ của bạn!
EDIT: Câu trả lời
Nhờ @eggypal dưới đây, tôi tìm thấy câu trả lời của tôi và dĩ nhiên nó rất đơn giản!
SELECT EV.*
FROM elvanto_calendars_events AS EV
RIGHT JOIN elvanto_calendars_events_meta AS EM1 ON EM1.`event_id` = EV.`id`
RIGHT JOIN elvanto_calendars_events_meta AS EM2 ON EM2.`meta_key` = CONCAT('repeat_interval_', EM1.`id`)
WHERE EM1.meta_key = 'repeat_start'
AND ((1336744800 - EM1.`meta_value`) % EM2.`meta_value`) = 0
Toán ngày dựa trên dấu thời gian và số giây cố định trong một ngày sẽ phá vỡ Tiết kiệm ánh sáng ban ngày. – DCoder
Cuộc gọi tốt @DCoder. Tôi lưu trữ tất cả thời gian của tôi như GMT và sau đó sử dụng hàm CONVERT_TZ để xác định ngày 'repeat_start'. Các ví dụ mã trên không bao gồm mã phụ này. Tôi nghĩ rằng nên làm các trick phải không? –
truy vấn của bạn có cho phép tôi xem kết quả cho ngày bắt đầu và ngày kết thúc đã cho không? '1336744800' trông giống như một ngày cụ thể: ( –