[英]Connect by level for SQL Server 2008 like Oracle
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;
输出:
22-JUL-12
23-JUL-12
18-JUL-12
19-JUL-12
20-JUL-12
21-JUL-12
我需要将此查询转换为SQL Server 2008,请帮助找到与之相同的解决方法...
我已经尝试了nDay从1到7的单个查询的输出。
您可以使用递归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,或者如果有日历表,则可以这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.