ASP.Net Webサイトでいくつかのコードをリファクタリングしようとしていますが、私が書いているストアドプロシージャに問題があります。日付範囲内のテーブルからすべての日付を選択し、空の日付に1行を含める
私がしたいのは、日付範囲を取得し、その範囲内のすべてのデータをテーブルから選択することですが、日付が存在しない場合でも行を選択する必要があります。
私の考えは、以下のコードでは、一時的なテーブルを作成し、日付範囲内のすべての日付を入力してから、これを選択しているテーブルに追加します。私はここで何か間違っていますか?この結合では、tempDateカラムは常にnullですが、テーブルをチェックして、そこにデータが入っています。
-- Parameters
DECLARE @DutyDate datetime='2012-01-01 00:00:00'
DECLARE @InstructorID nvarchar(2) = N'29'
DECLARE @datesTBL TABLE (tempDate DATETIME)
-- Variables
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SELECT
@StartDate =StartDate,
@EndDate = EndDate
FROM
DutyPeriodTbl
WHERE
(StartDate <= @DutyDate)
AND
(EndDate >= @DutyDate)
DECLARE @d DATETIME = @StartDate
WHILE @d<[email protected]
BEGIN
INSERT INTO @datesTBL VALUES (CONVERT(DATETIME, @d, 102))
SET @d=DATEADD(day,1,@d)
END
SELECT
dt.tempDate ,
InstructorID, EventStart,
EventEnd, cancelled,
cancelledInstructor,
EventType, DevName,
Room, SimLocation,
ClassLocation, Event,
Duration, TrainingDesc,
Crew, Notes,
LastAmended, InstLastAmended,
ChangeAcknowledged, Type,
OtherType, OtherTypeDesc,
CourseType
FROM
OpsInstructorEventsView iv
LEFT OUTER JOIN
@datesTBL dt
ON
CONVERT(DATETIME, iv.EventStart, 102) = CONVERT(DATETIME, dt.tempDate, 102)
WHERE
InstructorID = @InstructorID
AND
EventStart BETWEEN CONVERT(DATETIME, @StartDate, 102) AND CONVERT(DATETIME, @EndDate, 102)
ORDER BY
EventStart
CTEは、これを行うことができ、http://stackoverflow.com/questions/5899829/sqlを見てみましょう-server-how-to-select-all-days-in-date-range-to-no-data-exists-for-so –