2012-05-11 29 views
12

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 
+1

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

+1

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? –

+0

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ể: ( –

Trả lời

10

Nó không hoàn toàn rõ ràng những gì bạn muốn truy vấn của bạn để làm, nhưng jist của câu hỏi của bạn khiến tôi nghiêng về gợi ý rằng bạn nhìn vào số học modula: trong SQL, a % b trả về còn lại khi a được chia cho b - nếu không còn lại (ví dụ: a % b = 0), thì a phải là chính xác nhiều của b.

Trong trường hợp của bạn, tôi nghĩ bạn đang cố gắng tìm sự kiện trong đó thời gian giữa sự kiện bắt đầu và một số chữ nhất định là bội số chính xác của khoảng thời gian sự kiện: đó là (literal - event_start) % event_interval = 0. Nếu nó không khác, giá trị là thời gian cho lần xuất hiện tiếp theo sau literal (và do đó, để xác định liệu sự xuất hiện tiếp theo có xảy ra trong một khoảng thời gian hay không, giả sử một ngày sẽ kiểm tra xem phần còn lại có nhỏ hơn hay không chẳng hạn như hằng số (literal - event_start) % event_interval < 86400).

Nếu đây không phải là những gì bạn đang làm sau, vui lòng làm rõ chính xác những gì truy vấn của bạn đang cố gắng đạt được.

+0

Đó là mẹo! Tôi đã quản lý để làm cho nó hoạt động trong PHP: 'echo ((strtotime ('2012-05-22 00:00:00') - 1336312800)% 432000);' Tôi đã thử sử dụng '%' trong MySQL nhưng nó không hoạt động. Tương đương với chúng? –

+0

Xin lỗi Tôi sẽ sửa bài viết gốc của tôi bằng mã cuối cùng để giúp những người khác :) –

+0

Tôi bắt đầu theo dõi nó và thất bại. Giúp tôi. http://stackoverflow.com/questions/20286332/display-next-event-date – Billa

Các vấn đề liên quan