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;

出力:

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

このクエリをSQLServer2008に変換する必要があります。同じ回避策を見つけるのを手伝ってください......

私は1から7までのnDayで単一のクエリで上記の出力を試しました。

4

1 に答える 1

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テーブルに入力しました。

出力がクエリと一致しません。以下は、適度に近い2つの値の間のすべての日付を生成します。例を次に示します。

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を使用して、または存在する場合はカレンダーテーブルを使用してこれを行うこともできます。

于 2012-07-17T13:15:27.277 に答える