Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में मासिक वायदा डेटा को फ्रंट-महीने की समय श्रृंखला में संयोजित करना

इसमें बहुत सारी पूर्व-जांच होती है, लेकिन संक्षेप में, मुझे एक समय में एक चरण के आधार पर SQL चर का निर्माण करना था, जैसे कि यह "लेट एक्स =कुछ", "लेट वाई =एक्स + कुछ और" के कार्यक्रम में था। , आदि। सबसे आंतरिक @SQLVars चर का निर्माण करके, पहली बार घोषित होने के बाद, इसे अगले चर के आधार के रूप में उपयोग किया जा सकता है और इसी तरह ... सबसे पहले, यहां पूरी क्वेरी है जिसे आप अपने डेटा पर लागू कर सकते हैं जो बनाता है जो भी वर्तमान तिथि है उसके आधार पर। आप अपने डेटा को बेहतर तरीके से जानते हैं, इसमें कुछ बदलाव करने पड़ सकते हैं, लेकिन मुझे लगता है कि यह आपको अपने रास्ते पर ले जाता है।

select
      CONCAT( 'Q (', LEFT( MonthName( DateBasis.dMonth1 ), 3 ), ' ', RIGHT( Year( DateBasis.dMonth1 ), 2 ), ')' ) as FirstMonth,
      CONCAT( 'U (', LEFT( MonthName( DateBasis.dMonth2 ), 3 ), ' ', RIGHT( Year( DateBasis.dMonth2 ), 2 ), ')' ) as SecondMonth,
      CONCAT( 'V (', LEFT( MonthName( DateBasis.dMonth3 ), 3 ), ' ', RIGHT( Year( DateBasis.dMonth3 ), 2 ), ')' ) as ThirdMonth,
      CONCAT( 'X (', LEFT( MonthName( DateBasis.dMonth4 ), 3 ), ' ', RIGHT( Year( DateBasis.dMonth4 ), 2 ), ')' ) as FourthMonth
   from   
      ( select @FirstOfMonth dFirstOfMonth,
               @FDOM nWeekDay,
               @SWOM nSecondWedOfMonth,
               @SkipMonths nSkip,
               @Month1 dMonth1,
               @Month2 dMonth2,
               @Month3 dMonth3,
               @Month4 dMonth4
           from
              ( select @FirstOfMonth := CONCAT( year(curdate()), '-', month( curdate()), '-01' ),
                       @FDOW := DayOfWeek( @FirstOfMonth ),
                       @SWOM := if( @FDOW <= 4, 12, 19) - @FDOW,
                       @SkipMonths := if( day( CurDate()) <= @SWOM, 1, 2 ),
                       @Month1 := date_add( @FirstOfMonth, interval 0 +  @SkipMonths month ),
                       @Month2 := date_add( @Month1, interval 1 month ),
                       @Month3 := date_add( @Month2, interval 1 month ),
                       @Month4 := date_add( @Month3, interval 1 month )
                       ) sqlvars
      ) DateBasis

ऊपर दी गई इस एक क्वेरी का परिणाम पहला रिकॉर्ड (31 जनवरी की वर्तमान तिथि के आधार पर) दिखाने के लिए पहला महीना दूसरा महीना तीसरा महीना चौथा महीनाQ (मार्च 12) यू (12 अप्रैल) वी (12 मई) एक्स (12 जून)

दिखाएगा।

अब, इसे अपने टिकर आईडी के लिए अपनी शेष क्वेरी के अंदर कुछ इस तरह से नेस्ट करें

SELECT hist.date, 
       hist.ticker_id, 
       hist.settle_price, 
       hist.volume 
   FROM 
      hist,
      ( entire select statement above ) FinalDates

   WHERE 
          hist.ticker_id IN ( FinalDates.FirstMonth,
                              FinalDates.SecondMonth,
                              FinalDates.ThirdMonth,
                              FinalDates.FourthMonth )
      and hist.trade_dt = curdate()

यदि आप पहले बताए गए अंतरतम @SqlVariables को देखते हैं, तो यह "लेट एक्स =कुछ" के एक समूह की तरह है। मुझे हमेशा शुरू करने के लिए एक आधार की आवश्यकता होती है, इसलिए मैं किसी दिए गए महीने के पहले दिन को एक चर @FirstOfMonth में प्राप्त कर रहा हूं, जो कि वर्तमान तिथि का वर्ष है + "-" + वर्तमान तिथि का महीना + "-01" हमेशा महीने की पहली तारीख से शुरू होता है... उदा:आज 31 जनवरी, 2012 '2012-01-01' की एक स्ट्रिंग तैयार करेगा जो वर्ष/माह/तारीख प्रारूप में तुरंत MySQL द्वारा पहचाना जाता है दिनांक प्रारूप के रूप में हम दिनांक अंकगणित पर प्रदर्शन कर सकते हैं। तो अब, मेरे पास @FirstOfMonth ='2012-01-01' है। अब, हमें सप्ताह के पहले दिन को निर्धारित करने की आवश्यकता है, यह तारीख उस महीने का प्रतिनिधित्व करती है जिसमें हम हैं (इसलिए @FDOW)। यह 1-7 (रविवार =1, बुध =4, शनि =7) से एक मान लौटाएगा।

इससे अब हमें गणना करने की आवश्यकता है कि महीने का दूसरा बुधवार कब होगा। यदि सप्ताह का दिन रविवार से (और सहित) बुधवार है, तो दूसरा बुधवार 12 दिन माइनस सप्ताह का दिन है। उदाहरण:रविवार पहला बुध चौथा होगा, फिर बुध 11 वां होगा ... इसलिए 12 - 1 (रविवार) =11. यदि महीने का पहला दिन बुध था, तो यह सप्ताह का एक दिन होगा =4, लेकिन महीने का पहला =बुध, दूसरा बुध =8, इसलिए 12 - 4 =8। अब, यदि तारीख महीने के पहले के रूप में गुरु, शुक्र या शनि थी, तो सप्ताह का दिन 5, 6 या 7 होगा। . पहले बुधवार की न्यूनतम तिथि 7 होगी, दूसरी बुध 14 होगी, इसलिए यह 19 से शुरू हो रही है - सप्ताह का कोई भी दिन... 5, 6, 7... Ex:19 - 5 (गुरुवार का दिन) सप्ताह) =14, 19 - 6 (सप्ताह का शुक्रवार का दिन) =13, 19 - 7 (सप्ताह का शनिवार का दिन) =12.. पहली और आठवीं (महीने के सबसे शुरुआती) के विपरीत be 7 वां और 14 वां है।

अब जब हम जानते हैं कि महीने का दूसरा बुधवार कब है, तो इसकी तुलना उस तारीख से करें जिसके आधार पर हम क्वेरी चला रहे हैं (यानी:curdate() )। यदि वर्तमान तिथि चालू है या पहले (<=के माध्यम से) MONTH (@SWOM) के दूसरे सप्ताह, तो हम केवल 1 महीने से अधिक छोड़ना चाहते हैं ... यदि हम महीने में आगे हैं, तो हमें 2 महीने छोड़ना होगा।

अब, तिथियों का निर्माण करें। महीने 1 के लिए तारीख का आधार चालू महीने का पहला प्लस है, चाहे कितने भी महीनों का अंतराल हो। महीना 2 पहले महीने से एक महीना पहले, महीना 3 पिछले महीने 2, और महीना 4 पिछले महीने 3 से एक महीना है।

@FirstOfMonth := CONCAT( year(curdate()), '-', month( curdate()), '-01' ),
@FDOW := DayOfWeek( @FirstOfMonth ),
@SWOM := if( @FDOM <= 4, 12, 19) - @FDOM,
@SkipMonths := if( day( CurDate()) <= @SWOM, 1, 2 ),
@Month1 := date_add( @FirstOfMonth, interval 0 +  @SkipMonths month ),
@Month2 := date_add( @Month1, interval 1 month ),
@Month3 := date_add( @Month2, interval 1 month ),
@Month4 := date_add( @Month3, interval 1 month )

तो अंत में हमारे पास सभी 4 महीने के आधार पर काम करने के लिए (select ...) sqlvars परिणाम सेट कुछ ऐसा दिखा रहा है

@Month1     @Month2     @Month3     @Month4
2012-03-01  2012-04-01  2012-05-01  2012-06-01 ... the four months out

अंत में, एक बार जब यह डेटा ठीक दिखाई देता है, तो अब हम संबंधित "क्यू", "यू", "वी" और "एक्स" उपसर्गों के साथ-साथ महीने के नाम के बाएं 3 के साथ उन विशिष्ट स्ट्रिंग्स का निर्माण कर सकते हैं जिन्हें आप ढूंढ रहे हैं। अंक वर्ष।

इसलिए, इसके साथ सभी दिनांक सीमाएं और स्ट्रिंग्स प्राप्त करने की अपेक्षा कर रहे हैं, इसे अपनी अन्य तालिका के विरुद्ध क्वेरी करें जैसा कि मैंने प्रारंभिक में सूचीबद्ध किया है।

मुझे उम्मीद है कि यह आपकी मदद करेगा और एसक्यूएल को चकमा देने के लिए एक पूरी तरह से नए संदर्भ के लिए आपकी आंखें खोलता है ... संक्षेप में कई चर बनाने और उससे संचालित करने के लिए एक इनलाइन प्रोग्राम कर रहा है ... बहुत अच्छा हुह...

और पूरी सच्चाई में, यह पहली बार है जब मैंने विशेष रूप से इस तकनीक का प्रयास किया है, हालांकि मैंने SQLVars का उपयोग करके अतीत में कई प्रश्न किए हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अक्षांश देशांतर के आधार पर mysql से परिणाम प्राप्त करें

  2. PHP से mySQL में संग्रहित प्रक्रियाओं को कैसे सम्मिलित/बनाना है?

  3. दो टेबल से योग कैसे प्राप्त करें?

  4. एक कॉलम का चयन करना जो MySQL में भी एक कीवर्ड है

  5. मैसकल में किसी संख्या को शब्द में बदलना