2012-07-17 65 views
1
nDays := Round(dEndTime - dStartTime) + 1; 

For i in 1..7 Loop 
nDay := i + 1; 
    if i = 7 Then 
     nDay := 1; 
    End If; 

SELECT To_Date(To_Char((dStartTime+Level-1),'DD.MM.YYYY')||' 00:00','DD.MM.YYYY HH24:MI'), 
To_Date(To_Char((dStartTime+Level-1),'DD.MM.YYYY')||' 23:59','DD.MM.YYYY HH24:MI') 
FROM DUAL 
WHERE To_Char(dStartTime + Level -1 , 'd') = To_Char(nDay) 
CONNECT BY Level <= nDays; 

End Loop; 

輸出:連接由像Oracle的SQL Server 2008級

22-JUL-12 
23-JUL-12 
18-JUL-12 
19-JUL-12 
20-JUL-12 
21-JUL-12 

我需要此查詢到SQL Server 2008轉換,請幫忙查找具有相同的解決方法......

我已經嘗試過上面的輸出與nDay從1到7的單個查詢.....

+0

看看[這個問題](http://stackoverflow.com/questions/2200636/oracle-connect-by-clause-equivalent-in-sql-server),你可以在SQL服務器中同樣使用CTE到Oracle的連接(以及遞歸CTE現在是通過層次結構移動的ANSI標準方式)。 – 2012-07-17 13:11:32

+0

N西thks爲您的rpl – 2012-07-18 10:01:34

回答

1

你可以做一個遞歸的CTE。但是,語法可能很難記住,所以當我需要幾件作品,我做這樣的事情:

select * 
from (select row_number() over (order by (select NULL)) as seqnum 
     from information_schema.columns 
    ) t 
where seqnum < <value> 

可以使用任何表。我只是放在INFORMATION_SCHEMA.columns表中,因爲它很容易,一般有幾十或幾百行。

您的輸出與查詢不匹配。下面生成是相當接近的兩個值之間的所有日期,下面是一個例子:

declare @dstarttime date = '2012-07-11', @dendtime date= '2012-07-13'; 
with const as (select @dstarttime as dStartTime, @dendtime as dendTime) 
SELECT DATEADD(d, seqnum - 1, dStartTime) 
FROM (select * 
     from (select row_number() over (order by (select NULL)) as seqnum, const.* 
      from information_schema.columns cross join const 
      ) t 
     where seqnum <= DATEDIFF(d, dStartTime, dendTime) + 1 
    ) t 

正如我所說的,你也可以做到這一點遞歸CTE的,或者,如果你有一個,帶有日曆表。

+0

thnks爲您的rpl戈登Linoff,但根據您給定的解決方案,我已經使用它,通過下面也給你相同的輸出......,但我希望根據我的給定輸出... WITH DATERANGE(DT) AS (SELECT CONVERT(日期時間, '2009-01-01')dt的 UNION ALL SELECT DATEADD(DD,1,DT)DT FROM DATERANGE WHERE DT 2012-07-18 10:01:52