2014-11-27 8 views
7
declare @minDateTime as datetime; 
declare @maxDateTime as datetime; 

set @minDateTime = '2014-01-13 02:00:00'; 
set @maxDateTime = '2014-12-31 14:00:00'; 

मैं एक का चयन करें बयान कि @minDateTime और @maxDateTime के बीच हर घंटे इस प्रकार वापसी होगी बनाने के लिए देख रहा हूँ (। वहाँ से चुनने के लिए कोई तालिका है मैं कहाँ खंड के लिए नहीं देख रहा हूँ!):दो तिथियों के बीच सभी घंटे का चयन कैसे करें?

2014-01-13 02:00:00 
2014-01-13 03:00:00 
2014-01-13 04:00:00 
... 
2014-12-31 12:00:00 
2014-12-31 13:00:00 
2014-12-31 14:00:00 
+0

तो इसका कोई खास कारण आप Sql बजाय ग # में ऐसा करने की जरूरत है? –

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

@ जॉन सैंडर्स मैंने एक बार फिर कुछ नया सीखा। धन्यवाद;) – Marc

उत्तर

9

इसे आजमाएं। Recursive CTE का उपयोग करें।

DECLARE @minDateTime AS DATETIME; 
DECLARE @maxDateTime AS DATETIME; 

SET @minDateTime = '2014-01-13 02:00:00'; 
SET @maxDateTime = '2014-12-31 14:00:00'; 

; 
WITH Dates_CTE 
    AS (SELECT @minDateTime AS Dates 
     UNION ALL 
     SELECT Dateadd(hh, 1, Dates) 
     FROM Dates_CTE 
     WHERE Dates < @maxDateTime) 
SELECT * 
FROM Dates_CTE 
OPTION (MAXRECURSION 0) 

ऊपर क्वेरी Dates_CTE में एक Common Expression Table है, CTE के लिए आधार रिकॉर्ड UNION ALL से पहले पहले एसक्यूएल क्वेरी से ली गई है। क्वेरी का परिणाम आपको Minimum date देता है।

UNION ALL के बाद दूसरी क्वेरी परिणाम प्राप्त करने के लिए बार-बार निष्पादित की जाती है। यह प्रक्रिया recursive है और दिनांक जारी रहेगा जब तक दिनांक @maxDateTime से कम न हो।

+0

हैलो। मुझे निम्न संदेश मिला: कथन समाप्त हो गया। बयान पूरा होने से पहले अधिकतम रिकर्सन 100 समाप्त हो गया है। – Marc

+0

@Marc - मेरा बुरा चेक अब –

+0

बहुत बढ़िया :) बहुत बहुत धन्यवाद! – Marc

2

यहाँ एक और तरीका इस्तेमाल कर रहा है एक Tally Table:

DECLARE @minDateTime DATETIME; 
DECLARE @maxDateTime DATETIME; 

SET @minDateTime = '2014-01-13 02:00:00'; 
SET @maxDateTime = '2014-12-31 14:00:00'; 

DECLARE @hrsDiff INT; 
SELECT @hrsDiff = DATEDIFF(HH, @minDateTime, @maxDateTime); 

WITH E1(N) AS (
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
),--10E+1 or 10 rows 
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
Tally(N) AS(SELECT row_number() over(order by (select null)) from E4) -- Numbered rrow 
SELECT @minDateTime 
UNION ALL 
SELECT DATEADD(HH, N, @minDateTime) 
FROM Tally 
WHERE 
    N <= @hrsDiff 
संबंधित मुद्दे