Sql का उपयोग करके दिनांक फ़ील्ड से महीने तक समूह कैसे करें


84

मैं केवल दिनांक फ़ील्ड से महीने तक समूह कैसे बना सकता हूं (और दिन के अनुसार समूह नहीं)?

यहाँ मेरा दिनांक फ़ील्ड कैसा दिखता है:

2012-05-01

यहाँ मेरी वर्तमान एसक्यूएल है:

select  Closing_Date, Category,  COUNT(Status)TotalCount from  MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31'
and Defect_Status1 is not null
group by  Closing_Date, Category

जवाबों:


108

मैं इसका उपयोग करूंगा:

SELECT  Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;

यह हर महीने के पहले तक समूह करेगा, इसलिए

`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)` 

दे देंगे '20130101'। मैं आमतौर पर इस पद्धति को पसंद करता हूं क्योंकि यह तिथियों को तारीखों के रूप में रखता है।

वैकल्पिक रूप से आप कुछ इस तरह का उपयोग कर सकते हैं:

SELECT  Closing_Year = DATEPART(YEAR, Closing_Date),
        Closing_Month = DATEPART(MONTH, Closing_Date),
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEPART(YEAR, Closing_Date), DATEPART(MONTH, Closing_Date), Category;

यह वास्तव में निर्भर करता है कि आपका वांछित आउटपुट क्या है। (समापन वर्ष आपके उदाहरण में आवश्यक नहीं है, लेकिन यदि तिथि सीमा एक वर्ष सीमा पार कर जाती है तो यह हो सकती है)।


गैरेथ, धन्यवाद आदमी दोनों विधि ने ठीक काम किया। क्या कोई ऐसा तरीका है जिससे मैं वर्ष और महीने दोनों को एक साथ एक क्षेत्र में रख सकता हूं? इस प्रारूप को दिखाने के लिए अर्थ: दिसंबर -12 (दिसंबर माह है और वर्ष 12 है)। धन्यवाद
user1858332

पहली विधि ऐसा करेगी, आपको बस कॉलम को प्रारूपित करने की आवश्यकता है। मैं इसे SQL के बाहर करने की सलाह SELECT STUFF(SUBSTRING(CONVERT(VARCHAR, CURRENT_TIMESTAMP, 6), 4, 6), 4, 1, '-');
दूंगा

@GarethD क्या आप बता सकते हैं कि आपने 0 और तारीख के बीच सिर्फ डेटेडिफ का उपयोग कैसे किया। 0 कोई तारीख नहीं है।
इरफंदर

1
और यह भी कि Closing_Date = DATEADD (MONTH, DATEIFF (MONTH, 0, Closing_Date), 0) क्या करता है, केवल DATEADD (MONTH, DATEIFF (MONTH, 0, Closing_Date), 0)
irfandar

3
@irfandar 0 एक तारीख नहीं है, लेकिन SQL- सर्वर इसे 1 जनवरी 1900 को स्पष्ट रूप से परिवर्तित करता है। आपके दूसरे प्रश्न के Closing_Date =लिए बस कॉलम उर्फ ​​है, यह AS Closing_Dateअभिव्यक्ति के बाद होने के समान है । यह पूरी तरह से व्यक्तिपरक है, लेकिन मैं व्यक्तिगत रूप से इस alias =धारणा को पढ़ने में बहुत आसान हूं AS Alias। अधिक के लिए मैं क्यों पसंद करते हैं इस लेख को हारून बर्ट्रेंड ने पढ़ा
गैरेथ

41

दिनांक से माह निकालने के लिए DATEPART फ़ंक्शन का उपयोग करें ।

तो आप कुछ इस तरह से करेंगे:

SELECT DATEPART(month, Closing_Date) AS Closing_Month, COUNT(Status) AS TotalCount
FROM t
GROUP BY DATEPART(month, Closing_Date)

14
मैसकल के लिए आप DATEPART के बजाय MONTH () या MONTHNAME () का उपयोग कर सकते हैं
frazras

यदि आप इस क्वेरी को अक्सर चलाते हैं, तो उचित इंडेक्स बनाने पर विचार करें।
user_0

सरल उत्तर के लिए प्लस 1।
बर्डेम

9
यह अलग-अलग वर्षों के महीनों पर विचार करेगा - जो आमतौर पर अपेक्षित नहीं है।
ivan_pozdeev


14

मैंने इसे पूरा करने के लिए FORMAT फ़ंक्शन का उपयोग किया :

select
 FORMAT(Closing_Date, 'yyyy_MM') AS Closing_Month
 , count(*) cc 
FROM
 MyTable
WHERE
 Defect_Status1 IS NOT NULL
 AND Closing_Date >= '2011-12-01'
 AND Closing_Date < '2016-07-01' 
GROUP BY FORMAT(Closing_Date, 'yyyy_MM')
ORDER BY Closing_Month

9

जोड़कर MONTH(date_column)में GROUP BY

SELECT Closing_Date, Category,  COUNT(Status)TotalCount
FROM   MyTable
WHERE  Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND    Defect_Status1 IS NOT NULL
GROUP BY MONTH(Closing_Date), Category

1

DATEPART फ़ंक्शन MySQL 5.6 पर काम नहीं करता है, इसके बजाय MONTH ('2018-01-01') का उपयोग करें


1

इसे इस्तेमाल करे:

select min(closing_date), date_part('month',closing_date) || '-' || date_part('year',closing_date) AS month,
Category, COUNT(Status)TotalCount 
FROM MyTable
where Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND Defect_Status1 is not null
GROUP BY month, Category,
ORDER BY 1

इस तरह आप एक सम्मिलित तिथि प्रारूप के आधार पर समूहीकरण कर रहे हैं, एक द्वारा शामिल किया गया -


0
SELECT  to_char(Closing_Date,'MM'), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY Category;

0

SQL सर्वर 2012 संस्करण ऊपर,

SELECT  format(Closing_Date,'yyyy-MM') as ClosingMonth,
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY format(Closing_Date,'yyyy-MM'), Category;

-1

आप इसे वर्ष (), महीना () दिन () और दिनांक () का उपयोग करके कर सकते हैं।

आपके उदाहरण में यह होगा:

select  Closing_Date, Category,  COUNT(Status)TotalCount from  MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31' 
and Defect_Status1 is not null 
group by Year(Closing_Date), Month(Closing_Date), Category

यह मान्य SQL
Mad Echet

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

-1

निम्नलिखित कोड का प्रयास करें

SELECT  Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.