2014-11-27 13 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'; 

ich eine select-Anweisung zu erstellen suchen, die jede Stunde zwischen @minDateTime und @maxDateTime zurückkehren würde wie folgt (. Gibt es keine Tabelle zur Auswahl ich suche nicht für where-Klausel!):Wie wähle ich alle Stunden zwischen zwei Daten aus?

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

so gibt es einen guten Grund, warum Sie diese anstelle von C# in Sql tun müssen, um? –

+0

Ich habe deinen Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

@JohnSaunders Ich habe mal wieder etwas neues gelernt. Danke;) – Marc

Antwort

9

Versuchen Sie es. Verwenden Sie eine 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) 

In der obigen Abfrage Dates_CTE ist ein Common Expression Table, der Basissatz für die CTE wird durch die erste SQL-Abfrage vor UNION ALL abgeleitet. Das Ergebnis der Abfrage gibt Ihnen die Minimum date.

Zweite Abfrage nach UNION ALL wird wiederholt ausgeführt, um Ergebnisse zu erhalten. Dieser Prozess ist recursive und wird fortgesetzt, bis das Datum weniger als @maxDateTime ist.

+0

Hallo. Ich habe die folgende Nachricht: Die Anweisung wurde beendet. Die maximale Rekursion 100 wurde vor dem Abschluss der Anweisung erschöpft. – Marc

+0

@Marc - Mein schlechter Scheck jetzt –

+0

Awesome :) Vielen Dank! – Marc

2

Hier wird mit einer anderen Art und Weise eines 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 
Verwandte Themen