ग्रुप टू इंटरवल
आपको group by
. का उपयोग करना चाहिए प्रत्येक अंतराल के लिए एक समूह बनाने के लिए जिस पर आप औसत करना चाहते हैं।
select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500
यह इस तथ्य का उपयोग करता है कि एक तिथि और समय को स्पष्ट रूप से एक संख्या में परिवर्तित किया जा सकता है, जो तब प्रारूप का होगा YYMMDDhhmmss
. इस तरह की संख्या को 100 से विभाजित करने पर सेकंड की पट्टी हो जाती है, और इसी तरह 500 से विभाजित करने पर प्रत्येक 5 मिनट के अंतराल के लिए एक अद्वितीय संख्या प्राप्त होती है।
मेरे द्वारा चुना गया अतिरिक्त कॉलम अंतराल के मध्य देगा:अंतराल से किसी भी समय (यहां न्यूनतम चुनना, लेकिन यह वास्तव में कोई फर्क नहीं पड़ता), उस 5 मिनट के अंतराल संख्या में बदल गया, वापस दिनांक और समय में संख्या, और फिर ढाई मिनट जोड़ना। आप शुरुआत की गणना करने के लिए समान सिंटैक्स का उपयोग कर सकते हैं (बस + 230
. छोड़ दें) आउट) या (समावेशी) अंत (+ 459
) अंतराल के।
sqlfiddle का उपयोग करके परीक्षण किया गया ।
श्रेणी प्रबंधन की समाप्ति
ध्यान दें कि आपका BETWEEN
श्रेणी में 15:30:00
. से पंक्तियाँ शामिल होंगी लेकिन उस समय इंटरवल से कोई अन्य शुरू नहीं हुआ था। हो सकता है कि आप अपने चयन से सीमा के अंत को बाहर करना चाहें:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
आपको NULL क्यों मिलता है
क्यों आपकी क्वेरी NULL
उत्पन्न करती है? :अंतराल अंकगणित करने के लिए, आप पूरे अंतराल चीज़ को उद्धरणों में संलग्न नहीं करते हैं, और आप समय इकाइयों के लिए एकवचन नामों का उपयोग करते हैं। यानी
'2012-09-08 15:30:00' + INTERVAL 5 minute
लेकिन यह केवल सीमा को 2012-09-08 15:35:00
. तक बढ़ा देगा और फिर भी उन 5 मिनट के अंतराल को न बनाएं जो आप चाहते हैं। जिस तरह से आपने इसे लिखा है, आप दो तार जोड़ने की कोशिश कर रहे हैं, जो कि MySQL में तब तक संभव नहीं है जब तक कि स्ट्रिंग्स को संख्याओं में परिवर्तित नहीं किया जा सकता, इस स्थिति में उन नंबरों को जोड़ा जाएगा।
आप अंतराल के अनन्य अंत की गणना करने के लिए अंतराल अंकगणित का उपयोग करना चाह सकते हैं, अर्थात के बाद का पहला सेकंड अंतराल:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
बस 500
adding जोड़ रहे हैं 230
. के बजाय मेरी क्वेरी का परिणाम काम नहीं करेगा क्योंकि परिणामी संख्या प्रत्येक घंटे के अंतिम अंतराल के लिए एक अमान्य तिथि का प्रतिनिधित्व कर सकती है।