दिन/महीने/वर्ष तक MySQL प्रश्न समूह




date datetime (9)

क्या यह संभव है कि मैं यह निर्धारित करने के लिए एक सरल क्वेरी करता हूं कि एक निश्चित अवधि में मेरे पास कितने रिकॉर्ड हैं, जैसे कि वर्ष, महीना या दिन, जिसमें TIMESTAMP फ़ील्ड है, जैसे:

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

या और भी:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

मासिक आंकड़े रखने के लिए।

धन्यवाद!


आप ग्रुप बाय में यह बस MySQL DATE_FORMAT() फ़ंक्शन कर सकते हैं। आप कुछ मामलों में अतिरिक्त स्पष्टता के लिए एक अतिरिक्त कॉलम जोड़ना चाह सकते हैं, जैसे रिकॉर्ड्स कई सालों तक चलता है, फिर उसी महीने अलग-अलग महीनों में होता है। ऐसे कई विकल्प हैं जिन्हें आप इसे कस्टमाइज़ कर सकते हैं। कृपया इसे शुरू करने के लिए पढ़ें। उम्मीद है कि यह आपके लिए बहुत उपयोगी होना चाहिए। आपकी समझ के लिए नमूना क्वेरी यहां दी गई है

SELECT
    COUNT(id),
    DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY,
    DATE_FORMAT(record_date, '%Y-%m') AS MONTH,
    DATE_FORMAT(record_date, '%Y') AS YEAR,

FROM
    stats
WHERE
    YEAR = 2009
GROUP BY
    DATE_FORMAT(record_date, '%Y-%m-%d ');

इसको आजमाओ

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

एक्सट्रैक्ट (तिथि से इकाई) फ़ंक्शन बेहतर है क्योंकि कम समूहिंग का उपयोग किया जाता है और फ़ंक्शन एक संख्या मान देता है।

समूह की स्थिति जब समूहकरण DATE_FORMAT फ़ंक्शन से तेज़ होगा (जो स्ट्रिंग मान लौटाता है)। फ़ंक्शन | फ़ील्ड का उपयोग करने का प्रयास करें जो एसक्यूएल तुलना की स्थिति के लिए गैर स्ट्रिंग मान लौटाता है (जहां, हैविंग, ऑर्डर द्वारा ग्रुप बाय)।


मैं एक साल के समूह चयन को अनुकूलित करना पसंद करता हूं:

SELECT COUNT(*)
  FROM stats
 WHERE record_date >= :year 
   AND record_date <  :year + INTERVAL 1 YEAR;

इस तरह आप केवल एक वर्ष में बाध्य कर सकते हैं, उदाहरण के लिए '2009' नामित पैरामीटर के साथ और '-01-01' जोड़ने या अलग-अलग '2010' में जाने के बारे में चिंता करने की आवश्यकता नहीं है।

साथ ही, जैसा कि संभवतः हम पंक्तियों की गिनती कर रहे हैं और id कभी भी पूर्ण नहीं NULL , मैं COUNT(*) से COUNT(id) को प्राथमिकता देता हूं।


मैंने उपरोक्त 'WHERE' कथन का उपयोग करने का प्रयास किया, मैंने इसे सही मान लिया क्योंकि किसी ने इसे सही नहीं किया लेकिन मैं गलत था; कुछ खोजों के बाद मुझे पता चला कि यह WHERE कथन के लिए सही सूत्र है इसलिए कोड इस तरह बन जाता है:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

यदि आप किसी विशेष वर्ष (जैसे 2000) के लिए रिकॉर्ड फ़िल्टर करना चाहते हैं तो इस तरह WHERE क्लॉज को अनुकूलित करें:

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

के बजाय:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

परिणाम तालिका कॉलम पर 300k पंक्तियों और सूचकांक वाली तालिका के विरुद्ध उत्पन्न किए गए थे।

GROUP BY लिए, मैंने उपर्युक्त तालिका के खिलाफ तीन प्रकारों का परीक्षण किया; यहां परिणाम हैं:

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

अंतिम विजेता है।


यदि आप नवीनतम माह द्वारा आदेशित प्रत्येक वर्ष प्रति माह पंक्ति गणना के साथ मासिक आंकड़े प्राप्त करना चाहते हैं, तो इसे आजमाएं:

SELECT count(id),
      YEAR(record_date),
      MONTH(record_date) 
FROM `table` 
GROUP BY YEAR(record_date),
        MONTH(record_date) 
ORDER BY YEAR(record_date) DESC,
        MONTH(record_date) DESC

वर्तमान में सक्रिय रूप से अभी तक कम और अधिक लचीला विकल्प के साथ पूर्ण और सरल समाधान:

SELECT COUNT(*) FROM stats
-- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date)
GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')

.... group by to_char(date, 'YYYY') -> 1 9 8 9

.... group by to_char(date,'MM') -> 05

.... group by to_char(date,'DD') ---> 23

.... group by to_char(date,'MON') ---> मई

.... group by to_char(date,'YY') ---> 89






group-by