MySQL में महीने और वर्ष के आधार पर समूह


94

प्रत्येक पंक्ति पर एक टाइमस्टैम्प के साथ एक तालिका को देखते हुए, आप इस विशिष्ट json ऑब्जेक्ट प्रारूप में फिट होने के लिए क्वेरी को कैसे प्रारूपित करेंगे।

मैं वर्षों / महीनों में एक जोंस ऑब्जेक्ट को व्यवस्थित करने की कोशिश कर रहा हूं।

इस क्वेरी को बंद करने के लिए json:

{
  "2009":["August","July","September"],
  "2010":["January", "February", "October"]
}

यहाँ मेरे द्वारा अब तक की गई क्वेरी है -

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY MONTH(t.summaryDateTime) DESC";

क्वेरी टूट रही है क्योंकि यह (भविष्यवाणी) अलग-अलग वर्षों में एक साथ lumping है।

जवाबों:


184
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;

तुम क्या चाहते हो


60
+1: DATE_FORMAT का उपयोग करते हुए एक और विकल्प :DATE_FORMAT(t.summaryDateTime, '%Y-%m')
OMG Ponies

3
इस पर आगे, FROM_UNIXTIME की आवश्यकता है यदि आपके पास अपने DB में एक UNIX टाइमस्टैम्प हैDATE_FORMAT( FROM_UNIXTIME(t.summaryDateTime), '%Y-%m' )
डंकनमो जुले

धन्यवाद @OMGonies, आपके सिंटैक्स के साथ मैं सशर्त ग्रुप BY का प्रदर्शन करने में सक्षम हूं।
हेनरी

प्रदर्शन ... मेरी GROUP BY YEAR(date), MONTH(date) DESC;(~ 450 एमएस) की परीक्षा और GROUP BY DATE_FORMAT(date,'%Y-%m')(~ 850 एमएस)> 300,000 प्रविष्टियों के साथ एक InnoDB तालिका में पूर्व (इस सवाल का चिह्नित जवाब) ने उत्तरार्द्ध के रूप में ~ आधा समय लिया।
उल्लू

77
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')

StackOverflow में आपका स्वागत है! यह एक पुराना और पहले से ही उत्तर दिया गया प्रश्न है। यदि आप अधिक दबाव वाले प्रश्नों में भी योगदान दे सकते हैं तो हमें खुशी होगी। आप यहाँ अच्छे उत्तर देने के लिए सुझाव पा सकते हैं ।
एमफेट

ऊपर दिए गए उत्तर पर मेरी टिप्पणी देखें ... बड़े-ईश तालिकाओं पर यह विधि दो बार लंबी होती है।
उल्लू

8
SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM trading_summary t
GROUP BY YEAR(t.summaryDateTime) DESC, MONTH(t.summaryDateTime) DESC

सही ऑर्डर पाने के लिए YEAR और मंथ दोनों के लिए DESC का इस्तेमाल करना चाहिए।


8

मैं पसंद करता हूं

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";

6

मुझे पता है कि यह एक पुराना सवाल है, लेकिन निम्नलिखित कार्य करना चाहिए यदि आपको DB स्तर पर महीने के नाम की आवश्यकता नहीं है:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month;

EXTRACT फ़ंक्शन डॉक्स देखें

आपको शायद यह बेहतर प्रदर्शन करने वाला लगेगा .. और यदि आप आवेदन परत में एक JSON ऑब्जेक्ट का निर्माण कर रहे हैं, तो आप परिणाम के माध्यम से चलाने के रूप में स्वरूपण / आदेश कर सकते हैं।

NB मुझे नहीं पता था कि आप MySQL में एक ग्रुप BY क्लॉज में DESC जोड़ सकते हैं, शायद आप ORDER BY क्लॉज को याद कर रहे हैं:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month
ORDER BY summary_year_month DESC;

1
कृपया ध्यान दें कि उत्पादन से EXTRACT(YEAR_MONTH FROM summaryDateTime)है201901
एडगर ऑर्टेगा

@EdgarOrtega हां, लेकिन आवेदन तर्क का उपयोग करके मूल प्रश्न में वांछित JSON ऑब्जेक्ट उत्पन्न करने के लिए पर्याप्त होना चाहिए। यह मानते हुए कि क्वेरी परिणाम पर किसी प्रकार का लूपिंग पहले से ही हो रहा है, मेरे दृष्टिकोण का उद्देश्य डीबी से न्यूनतम आवश्यक जानकारी यथासंभव और जल्दी से जल्दी प्राप्त करना है
Arth

1
आप सही हैं, यह पर्याप्त होना चाहिए। मेरी टिप्पणी केवल यह बताने के लिए थी कि उस फ़ंक्शन से आउटपुट क्या है, शायद कोई उस प्रारूप को पसंद नहीं करता है।
एडगर ऑर्टेगा

@EdgarOrtega कोई चिंता नहीं, धन्यवाद, एक योग्य योगदान!
आर्थ

2

आपको ऐसा कुछ करना होगा

SELECT onDay, id, 
sum(pxLow)/count(*),sum(pxLow),count(`*`),
CONCAT(YEAR(onDay),"-",MONTH(onDay)) as sdate 
FROM ... where stockParent_id =16120 group by sdate order by onDay

2

आप यह भी करते हैं

SELECT  SUM(amnt) `value`,DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12

वर्ष और महीने के अनुसार ऑर्डर करने के लिए। कहते हैं कि आप इस वर्ष और इस महीने से 12 महीने पहले तक ऑर्डर करना चाहते हैं


1

इस तरह से EXTRACT फ़ंक्शन का उपयोग करें

mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
       -> 2009


0
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr

फिर भी आपको इसकी संरचना के लिए बाहरी लिपि में प्रक्रिया करनी होगी।

उदाहरण के लिए महीने के नामों की सूची से एक सरणी बनाने के लिए PHP के विस्फोट का उपयोग करें और फिर json_encode () का उपयोग करें


0

यह मेरा इसे करने का तरीका है:

GROUP BY  EXTRACT(YEAR_MONTH FROM t.summaryDateTime);

-2

उपयोग

GROUP BY year, month DESC";

के बजाय

GROUP BY MONTH(t.summaryDateTime) DESC";

यद्यपि ऐसा प्रतीत होता है कि GROUP BY MONTH (t.summaryDateTime) DESC महीनों को किसी कारण से ठीक से आदेश नहीं देता है ...
डेरेक Adair
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.