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'; 

Sto cercando di creare una dichiarazione prescelta che sarebbe tornato ogni ora tra @minDateTime e @maxDateTime come segue (. Non c'è un tavolo per selezionare da non sto cercando clausola where!):Come selezionare tutte le ore tra due date?

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

quindi c'è una buona ragione è necessario fare questo in SQL invece di C#? –

+0

Ho modificato il tuo titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

+0

@JohnSaunders Ho imparato ancora una volta qualcosa di nuovo. Grazie;) – Marc

risposta

9

Prova questo. Utilizzare uno 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) 

Nella query sopra Dates_CTE è un Common Expression Table, il record di base per la CTE è derivata dalla prima query SQL prima UNION ALL. Il risultato della query ti dà il Minimum date.

La seconda richiesta dopo UNION ALL viene eseguita ripetutamente per ottenere risultati. Questo processo è recursive e continuerà fino alle Date è inferiore a @maxDateTime.

+0

Ciao. Ho ricevuto il seguente messaggio: L'istruzione terminata. La ricorsione massima 100 è stata esaurita prima del completamento dell'istruzione. – Marc

+0

@Marc - Il mio controllo negativo ora –

+0

Fantastico :) Grazie mille! – Marc

2

Ecco un altro modo utilizzando un 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 
Problemi correlati