इसमें बहुत सारी पूर्व-जांच होती है, लेकिन संक्षेप में, मुझे एक समय में एक चरण के आधार पर 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 का उपयोग करके अतीत में कई प्रश्न किए हैं।