2つの日付の間のすべての日付を取得するにはどうすればよいですか?
@MAXDATE
テーブルの最大日付を格納している変数があります。ここで@Maxdate
、GETDATE()
との間のすべての日付を取得し、これらの日付をカーソルに格納したいと思います。
これまでのところ、私は次のようにしています。
;with GetDates As
(
select DATEADD(day,1,@maxDate) as TheDate
UNION ALL
select DATEADD(day,1, TheDate) from GetDates
where TheDate < GETDATE()
)
これは完全に機能していますが、これらの値をカーソルに保存しようとすると
SET @DateCurSor = CURSOR FOR
SELECT TheDate
FROM GetDates
コンパイルエラー
キーワード「SET」の近くの構文が正しくありません。
これを解決する方法は?
私の最初の提案は、カレンダーテーブルを使用することです。カレンダーテーブルがない場合は、作成します。それらは非常に便利です。クエリは次のように簡単です。
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
カレンダーテーブルを作成したくない場合、または作成できない場合でも、再帰CTEなしでオンザフライでこれを行うことができます。
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
これについてさらに読むには、以下を参照してください。
この一連の日付をカーソルで使用することに関しては、別の方法を見つけることを強くお勧めします。通常、はるかに優れたパフォーマンスを発揮するセットベースの代替手段があります。
だからあなたのデータで:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
2014年4月28日の数量を取得するには(私が収集するのはあなたの要件です)、実際には上記のいずれも必要ありません。単に次を使用できます。
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
特定のアイテムに使用したくない場合:
SELECT date, it_cd, qty
FROM ( SELECT date,
it_cd,
qty,
RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id
ORDER BY date DESC)
FROM T
WHERE Date <= '20140428'
) T
WHERE RowNumber = 1;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加