MySQL में सप्ताह के आधार पर समूह कैसे बनाएं?


91

Oracle की मेज सर्वर प्रदान करता है एक अंतर्निहित समारोह, TRUNC(timestamp,'DY')। यह फ़ंक्शन पिछले रविवार की आधी रात को किसी भी टाइमस्टैम्प को परिवर्तित करता है। MySQL में ऐसा करने का सबसे अच्छा तरीका क्या है?

ओरेकल TRUNC(timestamp,'MM')महीने के पहले दिन मध्यरात्रि को टाइमस्टैम्प में बदलने की भी पेशकश करता है जिसमें यह होता है। MySQL में, यह एक सीधा है:

TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))

लेकिन यह DATE_FORMATट्रिक हफ्तों तक काम नहीं करेगी। मैं WEEK(timestamp)फ़ंक्शन से अवगत हूं , लेकिन मैं वास्तव में वर्ष के भीतर सप्ताह संख्या नहीं चाहता हूं; यह सामान मल्टीयर काम के लिए है।


आपका मतलब ट्रंक (sysdate, 'W') है, ट्रंक (sysdate, 'DY') नहीं
डेविड एल्ड्रिज

TRUNC(date, 'DY' )रविवार की शुरुआत के साथ सप्ताह हो जाता है। 'W'सोमवार की शुरुआत हो जाती है, कम से कम मेरे सिस्टम में।
ओ। जोन्स

जवाबों:


123

आप इन दोनों भावों को और उपवाक्य में प्रयोग कर सकते हैं YEAR(timestamp)और दोनों का उपयोग कर सकते हैं ।WEEK(timestamp)SELECTGROUP BY

अत्यधिक सुरुचिपूर्ण नहीं है, लेकिन कार्यात्मक ...

और निश्चित रूप से आप इन दोनों तिथि भागों को एक ही अभिव्यक्ति में जोड़ सकते हैं, जैसे कि कुछ

SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))

संपादित करें : जैसा कि मार्टिन बताते हैं कि आप YEARWEEK(mysqldatefield)फ़ंक्शन का उपयोग भी कर सकते हैं , हालांकि इसका आउटपुट आंख के अनुकूल नहीं है, जैसा कि ऊपर दिए गए सूत्र के अनुसार है।


2 संपादित करें [3 1/2 साल बाद!]:
YEARWEEK(mysqldatefield)वैकल्पिक दूसरा तर्क ( mode) या तो 0 या 2 के लिए सेट के साथ पूर्ण सप्ताह तक एकत्र करने का सबसे अच्छा तरीका है (अर्थात 1 जनवरी से पहले सप्ताह तक चलने वाले सप्ताह सहित), यदि है क्या वांछित है YEAR() / WEEK()दृष्टिकोण शुरू में इस उत्तर में प्रस्तावित बंटवारे के प्रभाव में इस तरह के लिए समेकित डेटा है "straddling" पूर्व वर्ष के साथ एक, नया साल के साथ एक: दो सप्ताह में।
हर साल एक साफ-सुथरी कटौती, दो आंशिक सप्ताह तक, एक छोर पर, अक्सर लेखांकन आदि में वांछित होती है और इसके लिए YEAR() / WEEK()दृष्टिकोण बेहतर होता है।


12
YEARWEEK()एक में परिणाम INT(6)जो मेरा मानना है कि तरह के लिए तेजी से हो जाएगा / के साथ समूह में शामिल होने /
KCD

@ एमजेवी: क्या होता है जब दो साल एक ही सप्ताह में साझा होते हैं? इसके लिए 31-12-2012 से 6-1-2013 तक (सोम से सूर्य)। इस के लिए कोई भी समाधान है ?
हार्डिक

@ भारिक: देखें संपादित करें 2. किसी की जरूरतों के आधार पर वर्ष की अंतिम / पहली आंशिक सप्ताह को विभाजित करने के बजाय पूर्ण सप्ताह के साथ काम करने पर एक वर्ष के लिए YEARWEEK () एक बेहतर कुंजी हो सकती है।
mjv

@mjv है कि यहाँ के लिए एक और समाधान है लिंक
हार्दिक

सुनिश्चित करें कि "टाइमस्टैम्प" पूर्णांक नहीं है, जैसे मैं अपनी तालिका में था। WEEK (टाइमस्टैम्प) एक मान्य तर्क के रूप में तारीख / टाइमस्टैम्प कॉलम प्रकार लेता है
उस्मान शौकत

37

ऊपर दिया गया स्वीकृत उत्तर मेरे काम नहीं आया, क्योंकि इसने वर्णानुक्रम से हफ्तों का आदेश दिया, कालानुक्रमिक क्रम से नहीं:

2012/1
2012/10
2012/11
...
2012/19
2012/2

यहां सप्ताह के हिसाब से गिनती और समूह के लिए मेरा समाधान है:

SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, 
       YEAR(date), WEEK(date), COUNT(*)
FROM column_name
GROUP BY week_name
ORDER BY YEAR(DATE) ASC, WEEK(date) ASC

उत्पन्न करता है:

YEAR/WEEK   YEAR   WEEK   COUNT
2011/51     2011    51      15
2011/52     2011    52      14
2012/1      2012    1       20
2012/2      2012    2       14
2012/3      2012    3       19
2012/4      2012    4       19

4
दिनांक द्वारा आदेश ORDER BY date ASCदेना ( ) भी करना चाहिए
फेंडर

36

यह पता लगाया ... यह थोड़ा बोझिल है, लेकिन यहाँ यह है।

FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

और, यदि आपके व्यावसायिक नियम कहते हैं कि आपके सप्ताह सोमवार से शुरू होते हैं, तो बदल -1दें -2


संपादित करें

साल बीत गए हैं और मैं आखिरकार इसे लिखने के लिए तैयार हो गया हूं। http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/


@ ओली - मैं पठनीयता में सहायता के लिए DAYOFWEEK () या WEEKDAY () का उपयोग करने पर विचार करूंगा।
मार्टिन क्लेटन

1
मार्टिन, मैंने उस पर विचार किया और पाया कि वे कार्य सोमवार-रविवार के लिए 0-6 चलते हैं। मेरे व्यावसायिक नियम कहते हैं कि सप्ताह रविवार को 00:00 बजे से शुरू होता है, इसलिए WEEKDAY सामान थोड़ा बदसूरत हो गया। आप पठनीयता के बारे में सही हैं।
ओ। जोन्स

@ ऑलीजोन एकदम सही! आपको बहुत - बहुत धन्यवाद!
जो चेंग

1
महान समाधान और लेख। धन्यवाद!
जेरेमी विगिंस

"मोंडे" को मुट्ठी वाले दिन के रूप में सेट करने का एक तरीका है?
पेड्रो जोक्विन

25

आप YEARWEEK () फ़ंक्शन का उपयोग करके संक्षिप्त वर्ष और सप्ताह संख्या (200945) प्राप्त कर सकते हैं । अगर मैं आपके लक्ष्य को सही ढंग से समझ पा रहा हूं, तो आपको अपने बहु-वर्ष के डेटा को समूहीकृत करने में सक्षम होना चाहिए।

यदि आपको सप्ताह की शुरुआत के लिए वास्तविक टाइमस्टैम्प की आवश्यकता है, तो यह कम अच्छा है:

DATE_SUB( field, INTERVAL DAYOFWEEK( field ) - 1 DAY )

मासिक आदेश के लिए, आप LAST_DAY () फ़ंक्शन पर विचार कर सकते हैं - सॉर्ट महीने के अंतिम दिन तक होगा, लेकिन यह महीने के पहले दिन तक सॉर्ट करने के बराबर होना चाहिए ... क्या ऐसा नहीं होना चाहिए?


1
+1 मार्टिन। मेरे लिए Duh मैं YEARWEEK () के बारे में भूल गया ... मैं अभी इसका उपयोग नहीं करता हूं।
एमजेवी


2

यदि आपको "सप्ताह समाप्त" तिथि की आवश्यकता है तो यह भी काम करेगा। यह प्रत्येक सप्ताह के रिकॉर्ड की संख्या की गणना करेगा। उदाहरण: यदि तीन वर्क ऑर्डर (समावेशी) 1/2/2010 और 1/8/2010 के बीच बनाए गए थे और 5 (समावेशी) 1/9/2010 और 1/16/2010 के बीच बनाए गए थे, तो यह वापस आ जाएगा:

3 1/8/2010
5 1/16/2010

मुझे अपने डेटाइम क्षेत्र को छोटा करने के लिए अतिरिक्त DATE () फ़ंक्शन का उपयोग करना पड़ा।

SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending
FROM work_order wo
GROUP BY week_ending;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.