2014-11-27 20 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'; 
ben şöyle @minDateTime ve @maxDateTime arasında her saat dönecekti bir select deyimi oluşturmak için arıyorum

(. Arasından seçim yapmak tablo yok nerede yan tümcesi aramıyorum!):İki tarih arasındaki tüm saatleri nasıl seçerim?

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

böylece Sql yerine C# yapmanız gerekir iyi bir nedeni var? –

+0

Başlığınızı düzenledim. Lütfen, "[Sorular soruların başlığında" etiketler içeriyor mu? "(Http://meta.stackexchange.com/questions/19190/)" bölümüne bakacak olursak, fikir birliği "hayır, yapmamalı" dır. –

+0

@JohnSaunders Bir kez daha yeni bir şey öğrendim. Teşekkürler;) – Marc

cevap

9

Bunu deneyin. Recursive CTE kullanın. Yukarıdaki terimi Dates_CTE olarak

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) 

CTE için tabanı kaydı UNION ALL ilk önce SQL sorgusu ile elde edilir, bir Common Expression Table olup. Sorgunun sonucu size Minimum date verir.

UNION ALL sonrası ikinci sorgu, sonuçları almak için tekrar tekrar yürütülür. Bu işlem, recursive'dir ve Tarihler @maxDateTime'dan küçük olana kadar devam eder. İşte

+0

Merhaba. Aşağıdaki msg var: Açıklama sonlandırıldı. Maksimum yineleme 100, bildirimin tamamlanmasından önce tükendi. – Marc

+0

@Marc - Şimdi kötü kontrol et –

+0

Awesome :) Çok teşekkür ederim! – Marc

2

başka bir yolu kullanan bir 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 
İlgili konular