我想重構ASP.Net網站中的某些代碼,並且遇到了我正在編寫的存儲過程的問題。從一個日期範圍內的表中選擇所有日期,並且每個空日期包括1行
我想要做的是獲取日期範圍,然後從表中選擇該範圍內的所有數據,但如果日期不存在,我仍然需要選擇一行。
我的想法如下,您可以在下面的代碼中看到創建一個臨時表,然後將其填充到我的日期範圍內的所有日期,然後將其加入到我選擇的表中,但這不起作用。我在這裏做錯了什麼? tempDate列在這個連接中始終爲空,但是我已經檢查了表,並且它鬆散地包含了數據。
-- 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-a-date-range-even-if-no-data-exists-for-so –