mysql

2009-04-24 6 views
9

में महीने के सप्ताह के लिए फ़ंक्शन मैं एक mysql क्वेरी में महीने के सप्ताह (वर्ष के आसान सप्ताह की बजाय) प्राप्त करने के लिए एक साधारण कार्य की तलाश में था।mysql

सबसे अच्छा मैं के साथ आ सकता था:

WEEK(dateField) - WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField)-1 DAY)) + 1 

मुझे पता है कि अगर मैं पहिया यहाँ पुनर्रचना कर रहा हूँ अच्छा लगेगा, और वहाँ एक आसान और क्लीनर समाधान है तो क्या होगा?

उत्तर

12

AFAIK, महीने के पहले सप्ताह में कोई मानक नहीं है।

सप्ताह का पहला सप्ताह सप्ताह में Jan 4th है।

आप महीने के पहले सप्ताह को कैसे परिभाषित करते हैं?

अद्यतन:

आप इस तरह आपकी क्वेरी को फिर से लिखने की आवश्यकता होगी:

SELECT WEEK(dateField, 5) - 
     WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField) - 1 DAY), 5) + 1 

ताकि साल संक्रमण सही ढंग से नियंत्रित किया जाता है, और सप्ताह Monday पर शुरू करते हैं।

अन्यथा, आपकी क्वेरी ठीक है।

+0

मुझे लगता है कि यह सबसे सामान्य समाधान नहीं हो सकता है, लेकिन मुझे एक सप्ताह की आवश्यकता के लिए सोमवार को शुरू होता है। तो कहें कि पहला महीना रविवार को पड़ता है, कि रविवार सप्ताह 1 के रूप में गिना जाएगा। अगर यह समझ में आता है ... – YiSh

8

एक विकल्प है जिसे कभी-कभी डेटाबेस रिपोर्टिंग में उपयोग किया जाता है। यह एक टेबल बनाने के लिए है, आइए इसे ALMANAC कहते हैं, जिसमें प्रति पंक्ति एक पंक्ति (कुंजी) है, और उस तारीख की हर आवश्यक विशेषता है जो रिपोर्टिंग उद्देश्यों के लिए उपयोगी हो सकती है।

महीने कॉलम के सप्ताह के अलावा, तिथि एक कंपनी छुट्टी है या नहीं, इसके लिए एक कॉलम हो सकता है। अगर आपकी कंपनी का वित्तीय वर्ष जुलाई या किसी अन्य महीने में शुरू होता है, तो आप वित्तीय वर्ष, वित्तीय माह, वित्तीय सप्ताह इत्यादि शामिल कर सकते हैं, जिसमें प्रत्येक तिथि संबंधित है।

फिर आप इस तालिका को पतली हवा से बाहर करने के लिए एक कार्यक्रम लिखते हैं, जो कि कई बार पॉप्युलेट करने के लिए दी गई है। आप इस कार्यक्रम में सिर्फ एक बार पागल कैलेंडर गणना शामिल करते हैं।

फिर, जब आपको किसी अन्य तालिका में किसी दिनांक के लिए विशेषता जानने की आवश्यकता होती है, तो आप बस शामिल हों और कॉलम का उपयोग करें। हाँ, यह एक और शामिल है। और नहीं, यह तालिका सामान्य नहीं है। लेकिन यह अभी भी कुछ विशिष्ट आवश्यकताओं के लिए अच्छा डिजाइन है।

0

एक सप्ताह के साथ मेरा समाधान रविवार को शुरू होता है।

SELECT (1 + ((DATE_FORMAT(DATE_ADD(LAST_DAY(DATE_ADD('2014-07-17', 
    INTERVAL -1 MONTH)), INTERVAL 1 DAY),'%w')+1) + 
    (DATE_FORMAT('2014-07-17', '%d')-2)) DIV 7) "week_of_month"; 
1

(बस भविष्य पाठकों के लिए स्पष्ट करने के लिए: इस पुराने सवाल करने के लिए इस सवाल का जवाब एक इनाम है कि निहित वर्तमान जवाब संतोषजनक नहीं था की वजह से जोड़ा गया है, तो मैं अतिरिक्त के साथ इस समाधान/परिभाषा जोड़ा सभी प्रकार की स्थितियों के लिए "कॉन्फ़िगरेशन विकल्प"।)

Week of month के लिए कोई मानक परिभाषा नहीं है, लेकिन एक सामान्य समाधान निम्न सूत्र हो सकता है, कि आप अपनी आवश्यकताओं के configurate कर सकते हैं:

select (dayofmonth(dateField) + 6 + (7 - "min_days_for_partial_week") 
     - (weekday(datefield) - "weekday_startofweek" + 7) MOD 7) DIV 7 as week_of_month; 

जहां

  • "weekday_startofweek" हो गया है सप्ताह के दिन बदल दिया गया है कि आप सप्ताह के पहले दिन (0 = Monday, 6 = Sunday) बनना चाहते हैं।
  • "min_days_for_partial_week" पहले सप्ताह को सप्ताह 1 के रूप में गिनने की संख्या है (मान 1 से 7)। सामान्य मान 1 (महीने का पहला दिन हमेशा सप्ताह 1 होता है), 4 (यह वर्ष के "आईएसओ सप्ताह" के समान होगा, जहां वर्ष का पहला सप्ताह उस सप्ताह में होता है जिसमें गुरुवार होता है, इसलिए कम से कम 4 दिन), और 7 (सप्ताह 1 पहला पूरा सप्ताह है)।

यह सूत्र 06 पर मान वापस करेगा। 0 मतलब यह है कि वर्तमान सप्ताह के एक आंशिक सप्ताह वह पर्याप्त दिनों सप्ताह 1 के रूप में गिनती करने के लिए नहीं है, और 6 तभी हो सकता है जब आप कम से कम 3 दिन के साथ आंशिक सप्ताह सप्ताह होने के लिए 1.

उदाहरण के लिए अनुमति देते है:

तो सप्ताह का पहला दिन सोमवार ("weekday_startofweek" = 0) है और सप्ताह 1 हमेशा एक पूरे हफ्ते ("min_days_for_partial_week" = 7) होना चाहिए, यह,

select (dayofmonth(dateField) + 6 - weekday(datefield)) DIV 7 as week_of_month; 

उदाहरण के लिए आसान बनाने के लिए 2016-06-02 आप 0 मिल जाएगा, क्योंकि जून 2016 एक बुधवार के साथ शुरू किया y और 2016-06-06 के लिए आप 2016 जून

में 1 मिल जाएगा, क्योंकि यह पहले सोमवार है अपने सूत्र, जहां सप्ताह के पहले दिन हमेशा सप्ताह 1 ("min_days_for_partial_week" = 1) है का अनुकरण करने के लिए, और सप्ताह रविवार से शुरू होता है ("weekday_startofweek" = 6), इस

select (dayofmonth(dateField) + 12 - (weekday(datefield) + 1) MOD 7) DIV 7 as week_of_month; 

हो यद्यपि आप है कि ठीक से 2 साल जहाँ आपके स्थिरांक से आया में पता करने के लिए टिप्पणी करने के लिए चाहते हो सकता है जाएगा।