2010-05-06 11 views
5

मैं पिछले 24 घंटों के लिए डेटाबेस में प्रति घंटे रिकॉर्ड की संख्या सूचीबद्ध करने की कोशिश कर रहा हूं। प्रत्येक पंक्ति उस घंटे को रिकॉर्ड किए गए रिकॉर्ड प्रदर्शित करती है, साथ ही यह कितनी घंटे पहले थी। इसे अभी रिटर्नMySQL: पिछले 24 घंटों के लिए घंटे के अनुसार रिकॉर्ड्स,

SELECT COUNT(*), FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY HOUR(time) 
ORDER BY time ASC 

:

यहाँ मेरी क्वेरी अब

28 23 
62 23 
14 20 
1 4 
28 3 
19 1 

23 घंटे पहले, से दो पंक्तियों से पता चलता है कि जब यह केवल प्रति घंटे एक दिखाना चाहिए। मुझे लगता है कि यह समय की शुरुआत में समय प्राप्त करने के बजाय अब() का उपयोग करने के साथ कुछ करने के लिए है, जिसे मैं प्राप्त करने के बारे में अनिश्चित हूं।

ऐसा करने का एक आसान तरीका होना चाहिए।

उत्तर

4

यदि आप HOUR(time) द्वारा समूहित हैं तो आपको अपने चयन भाव में HOUR(time) का उपयोग करना चाहिए, और time नहीं। उदाहरण के लिए:

SELECT HOUR(time), COUNT(*) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY HOUR(time) 
ORDER BY HOUR(time) 

वैकल्पिक रूप से आप कर सकते हैं अभिव्यक्ति वापस करना चाहते द्वारा समूह:

SELECT COUNT(*), FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
ORDER BY FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 

मामले में आप सोच रहे थे, तो वह ऐसा ही क्वेरी में NOW() कई बार फोन करने के लिए सुरक्षित है।

कार्य है कि वर्तमान दिनांक या समय प्रत्येक लौट क्वेरी निष्पादन के शुरू में केवल एक बार प्रति क्वेरी मूल्यांकन किया जाता है: manual से। इसका मतलब यह है कि एक प्रश्न के भीतर अब() जैसे फ़ंक्शन के कई संदर्भ हमेशा एक ही परिणाम उत्पन्न करते हैं।

संबंधित मुद्दे