कोई संग्रहीत कार्यविधियाँ, अस्थायी तालिकाएँ, केवल एक क्वेरी, और दिनांक स्तंभ पर एक अनुक्रमणिका दी गई एक कुशल निष्पादन योजना:
select
subdate(
'2012-12-31',
floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30 + 30 - 1
) as "period starting",
subdate(
'2012-12-31',
floor(dateDiff('2012-12-31', dateStampColumn) / 30) * 30
) as "period ending",
count(*)
from
YOURTABLE
group by floor(dateDiff('2012-12-31', dateStampColumn) / 30);
यह स्पष्ट होना चाहिए कि यहाँ क्या हो रहा है, इस मंत्र को छोड़कर:
floor(dateDiff('2012-12-31', dateStampColumn) / 30)
वह व्यंजक कई बार प्रकट होता है, और यह 30 दिन पहले की अवधि का मूल्यांकन करता है dateStampColumn
है। dateDiff
दिनों में अंतर लौटाता है, इसे 30 दिनों की अवधि में प्राप्त करने के लिए 30 से विभाजित करता है, और यह सब floor()
पर फ़ीड करता है इसे एक पूर्णांक में गोल करने के लिए। एक बार हमारे पास यह नंबर हो जाने पर, हम GROUP BY
. कर सकते हैं यह, और आगे हम इस संख्या को अवधि की आरंभिक और समाप्ति तिथियों में वापस अनुवाद करने के लिए थोड़ा गणित करते हैं।
बदलें '2012-12-31'
now()
. के साथ आप चाहें तो। यहां कुछ नमूना डेटा दिया गया है:
CREATE TABLE YOURTABLE
(`Id` int, `dateStampColumn` datetime);
INSERT INTO YOURTABLE
(`Id`, `dateStampColumn`)
VALUES
(1, '2012-10-15 02:00:00'),
(1, '2012-10-17 02:00:00'),
(1, '2012-10-30 02:00:00'),
(1, '2012-10-31 02:00:00'),
(1, '2012-11-01 02:00:00'),
(1, '2012-11-02 02:00:00'),
(1, '2012-11-18 02:00:00'),
(1, '2012-11-19 02:00:00'),
(1, '2012-11-21 02:00:00'),
(1, '2012-11-25 02:00:00'),
(1, '2012-11-25 02:00:00'),
(1, '2012-11-26 02:00:00'),
(1, '2012-11-26 02:00:00'),
(1, '2012-11-24 02:00:00'),
(1, '2012-11-23 02:00:00'),
(1, '2012-11-28 02:00:00'),
(1, '2012-11-29 02:00:00'),
(1, '2012-11-30 02:00:00'),
(1, '2012-12-01 02:00:00'),
(1, '2012-12-02 02:00:00'),
(1, '2012-12-15 02:00:00'),
(1, '2012-12-17 02:00:00'),
(1, '2012-12-18 02:00:00'),
(1, '2012-12-19 02:00:00'),
(1, '2012-12-21 02:00:00'),
(1, '2012-12-25 02:00:00'),
(1, '2012-12-25 02:00:00'),
(1, '2012-12-26 02:00:00'),
(1, '2012-12-26 02:00:00'),
(1, '2012-12-24 02:00:00'),
(1, '2012-12-23 02:00:00'),
(1, '2012-12-31 02:00:00'),
(1, '2012-12-30 02:00:00'),
(1, '2012-12-28 02:00:00'),
(1, '2012-12-28 02:00:00'),
(1, '2012-12-30 02:00:00');
और परिणाम:
period starting period ending count(*)
2012-12-02 2012-12-31 17
2012-11-02 2012-12-01 14
2012-10-03 2012-11-01 5
अवधि के समापन बिंदु शामिल हैं।
इसके साथ SQL Fiddle में खेलें ।
इसमें कुछ संभावित मूर्खता है कि शून्य मिलान पंक्तियों वाली किसी भी 30 दिन की अवधि को परिणाम में शामिल नहीं किया जाएगा। यदि आप इसे पीरियड्स की तालिका में शामिल कर सकते हैं, तो इसे समाप्त किया जा सकता है। हालांकि, MySQL में PostgreSQL के generate_series()जैसा कुछ नहीं है। ए> , इसलिए आपको अपने आवेदन में इसका समाधान करना होगा या आज़माएं। यह चतुर हैक ।