ユーザーが開始日と終了日を入力できるようにする Web アプリケーションを開発しています。これを後でカレンダーに表示したいので、開始日と終了日の間にすべての日付をデータベース テーブルに挿入する必要があると思います。例: 01/01/2012 02/01/2012 03/01/2012 04/01/2012
開始日と終了日 (2012 年 1 月 1 日と 2012 年 4 月 1 日など) しかない場合、これを行う簡単な方法はありますか?
ありがとう
ユーザーが開始日と終了日を入力できるようにする Web アプリケーションを開発しています。これを後でカレンダーに表示したいので、開始日と終了日の間にすべての日付をデータベース テーブルに挿入する必要があると思います。例: 01/01/2012 02/01/2012 03/01/2012 04/01/2012
開始日と終了日 (2012 年 1 月 1 日と 2012 年 4 月 1 日など) しかない場合、これを行う簡単な方法はありますか?
ありがとう
ループではなく、次のことを試すことができます。
;WITH x(n) AS
(
SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate) + 1)
ROW_NUMBER() OVER (ORDER BY [object_id]) - 1
FROM sys.all_objects
)
-- INSERT dbo.table_name(date_column)
SELECT DATEADD(DAY, n, DATEADD(DAY, DATEDIFF(DAY, '19000101', @StartDate), '19000101'))
FROM x;
(INSERT
ロジックと出力を信頼する場合はコメントアウトしてください。)
また、2000 日以上では十分な変動がない場合は、sys.all_columns
(7500+) に変更するか、独自の数値表を使用できます。
述べられた要件に基づいてこれを行う必要があるかどうか疑問に思いますが、これは次の方法です。
DECLARE @InsertDate DATETIME = @StartDate;
WHILE @InsertDate <= @EndDate
BEGIN
INSERT dbo.MyTable (Date) VALUES (@InsertDate)
SET @InsertDate = @InsertDate + 1 --SQL does implicit conversion from integer to date (1 = 1 day)
END
編集:コメントに対処するために、これも有効です(おそらく推奨されますが、 DATETIME で使用した場合の暗黙的な変換で問題が発生したことはありません)
SET @InsertDate = dateadd(d, 1, @InsertDate)