2012-07-17 63 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