दिलचस्प पोस्ट
तारों से नामों के साथ चर बनाएँ कैसे मैं स्थानीय समय को यूटीसी में पायथन में बदल सकता हूं? पायथन पर कीबोर्ड और माउस अनुकरण करने का सबसे आसान तरीका कौन सा है? आईफोन एचटीएमएल 5 वीडियो प्ले बटन छिपाएं एपीआई का इस्तेमाल करते हुए instagram के लिए चित्रों को कैसे पोस्ट करें ऐप स्टोर पर ऐप के साथ कैसे जुड़ें MVC WebApi मैप में एक विधि कैसे एक एचटीटीपी क्रिया में है? अजगर का उपयोग करके फ़ाइल को 'प्रिंट' आउटपुट कैसे रीडायरेक्ट करें? गैर-स्थैतिक const सदस्य, डिफ़ॉल्ट असाइनमेंट ऑपरेटर का उपयोग नहीं कर सकते fgets scanf के बाद काम नहीं करता है PHP की मौत की सफेद स्क्रीन जावा में दो धागे का उपयोग करके प्रिंटिंग और ओड भी इनपुट प्रकार = "फ़ाइल" पर कर्सर प्रकार बदलें एएसपी। नेट का सत्र पूरी तरह से बदल रहा है गतिविधि और टुकड़ा गतिविधि के बीच का अंतर

2 तारीख मापदंडों के बीच और इसमें दिनांक के साथ एक अस्थायी तालिका को पॉप्युलेट करने का सबसे आसान तरीका

2 तारीख पैरामीटर के साथ और बीच की तारीखों के साथ एक अस्थायी तालिका को पॉप्युलेट करने का सबसे आसान तरीका क्या है मुझे महीने की तिथियों के पहले दिन की आवश्यकता है।

तो उदाहरण के लिए अगर @StartDate = '2011-01-01' और @EndDate = '2011-08-01'

तो मैं चाहता हूं कि यह तालिका में वापस आ गया

2011-01-01 2011-02-01 2011-03-01 2011-04-01 2011-05-01 2011-06-01 2011-07-01 2011-08-01 

वेब के समाधान से एकत्रित समाधान "2 तारीख मापदंडों के बीच और इसमें दिनांक के साथ एक अस्थायी तालिका को पॉप्युलेट करने का सबसे आसान तरीका"

यह काम करता है भले ही @ स्टार्टडेट महीने का पहला नहीं है। मैं मान रहा हूँ कि यदि यह महीने की शुरुआत नहीं है, तो आप अगले महीने के पहले से शुरू करना चाहते हैं। अन्यथा +1 हटाएं:

 ;WITH cte AS ( SELECT CASE WHEN DATEPART(Day,@StartDate) = 1 THEN @StartDate ELSE DATEADD(Month,DATEDIFF(Month,0,@StartDate)+1,0) END AS myDate UNION ALL SELECT DATEADD(Month,1,myDate) FROM cte WHERE DATEADD(Month,1,myDate) <= @EndDate ) SELECT myDate FROM cte OPTION (MAXRECURSION 0) 
 declare @StartDate date = '2014-01-01'; declare @EndDate date = '2014-05-05'; ;WITH cte AS ( SELECT @StartDate AS myDate UNION ALL SELECT DATEADD(day,1,myDate) as myDate FROM cte WHERE DATEADD(day,1,myDate) <= @EndDate ) SELECT myDate FROM cte OPTION (MAXRECURSION 0) 
 declare @StartDate datetime declare @EndDate datetime select @StartDate = '2011-01-01' , @EndDate = '2011-08-01' select @StartDate= @StartDate-(DATEPART(DD,@StartDate)-1) declare @temp table ( TheDate datetime ) while (@StartDate<=@EndDate) begin insert into @temp values (@StartDate ) select @StartDate=DATEADD(MM,1,@StartDate) end select * from @temp 

स्टार्टडेट के महीने के शुरुआती दिन पर वापस जाकर @ स्टार्टडेट महीने के पहले दिन नहीं है, भले ही काम करता है

यह SQL 2008 R2 में परीक्षण किया गया है

 Declare @StartDate datetime = '2015-03-01' Declare @EndDate datetime = '2015-03-31' declare @temp Table ( DayDate datetime ); WHILE @StartDate <= @EndDate begin INSERT INTO @temp (DayDate) VALUES (@StartDate); SET @StartDate = Dateadd(Day,1, @StartDate); end ; select * from @temp 

परिणाम:

 DayDate ----------------------- 2015-03-01 00:00:00.000 2015-03-02 00:00:00.000 2015-03-03 00:00:00.000 2015-03-04 00:00:00.000 ... 

उपाय:

 DECLARE @StartDate DATETIME ,@EndDate DATETIME; SELECT @StartDate = '20110105' ,@EndDate = '20110815'; SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(MONTH, v.number, @StartDate)), 0) AS FirstDay --or Andriy M suggestion: --SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate) + v.number, 0) AS FirstDay INTO #Results FROM master.dbo.spt_values v WHERE v.type = 'P' AND DATEDIFF(MONTH, @StartDate, @EndDate) >= v.number; SELECT * FROM #Results; DROP TABLE #Results; 

परिणाम:

 FirstDay ----------------------- 2011-01-01 00:00:00.000 2011-02-01 00:00:00.000 2011-03-01 00:00:00.000 2011-04-01 00:00:00.000 2011-05-01 00:00:00.000 2011-06-01 00:00:00.000 2011-07-01 00:00:00.000 2011-08-01 00:00:00.000 

दिलचस्प बात यह है कि इस आलेख के अनुसार एन्यूमरेटेड डेटा से इसे बनाने के लिए तेज़ी से काम करना है।

 DECLARE @StartDate DATE = '10001201'; DECLARE @EndDate DATE = '20000101'; DECLARE @dim TABLE ([date] DATE) INSERT @dim([date]) SELECT d FROM ( SELECT d = DATEADD(DAY, rn - 1, @StartDate) FROM ( SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate)) rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ORDER BY s1.[object_id] ) AS x ) AS y; 

मेरी मशीन पर, यह बड़ी डेट सीमाओं के साथ लगभग 60% तेज है। पुनरावर्ती पद्धति 2000 वर्षों में लगभग 3 सेकंड में डेटा के आबादी कर सकती है, हालांकि, और बहुत अच्छा दिखता है, इसलिए मैं वास्तव में दिनों में वृद्धि के लिए इस पद्धति की सिफारिश नहीं करता।

रिक्त तिथियों के लिए सुधार:

 IF OBJECT_ID('tempdb..#dim') IS NOT NULL DROP TABLE #dim CREATE TABLE #dim ([date] DATE) if not @Begin_Date is null and not @End_Date is null begin INSERT #dim([date]) SELECT d FROM( SELECT d = DATEADD(DAY, rn - 1, @Begin_Date) FROM ( SELECT TOP (DATEDIFF(DAY, @Begin_Date, @End_Date)) rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ORDER BY s1.[object_id] ) AS x ) AS y; end