मैं id
. नामक सिर्फ एक कॉल के साथ एक टैली टेबल बनाऊंगा और उस तालिका को 0 से 500 तक की संख्याओं से भरें। अब हम आसानी से इसका उपयोग थोड़ी देर के लूप का उपयोग करने के बजाय चयन करने के लिए करते हैं।
Id
-------------------------------------
0
1
2
etc...
फिर मैं घटनाओं को Name as varchar
. के साथ एक तालिका में संग्रहीत करता हूं , startdate as datetime
और repeats as int
Name | StartDate | Repeats
-------------------------------------
Meeting | 2012-12-10 00:00:00 | 7
Lunch | 2012-12-10 00:00:00 | 1
अब हम दो तिथियों के बीच सभी तिथियों का चयन करने के लिए टैली टेबल का उपयोग कर सकते हैं:
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
फिर हम इसे इवेंट टेबल पर शामिल करते हैं ताकि स्टार्टडेट और शोडेट के बीच अंतर की गणना की जा सके। हमने इसके परिणामों को repeats
. द्वारा विभाजित किया है कॉलम और यदि शेष 0
है , हमारे पास मैच है।
सभी संयुक्त हो जाते हैं:
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
जिसका परिणाम
. होता है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
अब आप चीजों को गति दे सकते हैं (और चाहिए!) उदाहरण के लिए, किसी तालिका में दिनांकों को सीधे संग्रहीत करके ताकि आप दिनांकित के साथ मिलान तालिका का उपयोग करने के बजाय सीधे सभी तिथियों का चयन कर सकें। हर चीज जिसे आप कैश कर सकते हैं और फिर से गणना करने की आवश्यकता नहीं है, वह अच्छी है।