如果你有一個主日期表,你可以簡單地查詢下一年的星期一和星期四的表格,並且可以使用插入選擇...語法。
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = '1/1/2013'
SET @EndDate = '12/31/2013'
INSERT INTO DestinationTable(Date,StartTime,EndTime)
SELECT DM.Date,
CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1400'
WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1300'
END AS StartTime,
CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1700'
WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1500'
END AS EndTime
FROM DateMaster DM
WHERE DM.Date Between @StartDate AND @EndDate
AND DATENAME(dw,DM.Date) IN ('Thursday','Monday')
但是,如果您沒有主日期表,那麼我們可以循環整整一年並填寫表格。
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
DECLARE @DateVar DateTime
SET @StartDate = '1/1/2013'
SET @EndDate = '12/31/2013'
SET @DateVar = @StartDate
WHILE @DateVar <= @EndDate
BEGIN
INSERT INTO DestinationTable(Date,StartTime,EndTime)
SELECT @DateVar,
CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '1400'
WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '1300'
END AS StartTime,
CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '1700'
WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '1500'
END AS EndTime
WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday')
SET @DateVar = DATEADD(d,1,@DateVar)
END
您可以通過跳躍其他天,而不是僅僅增加一天可以更有效......
CTE
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = '1/1/2013'
SET @EndDate = '12/31/2013'
;WITH DateMaster(Date)
AS
(
SELECT @StartDate
UNION ALL
SELECT DATEADD(d,1,Date)
FROM DateMaster
WHERE DATEADD(d,1,Date) <= @EndDate
)
INSERT INTO DestinationTable(Date,StartTime,EndTime)
SELECT DM.Date,
CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1400'
WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1300'
END AS StartTime,
CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1700'
WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1500'
END AS EndTime
FROM DateMaster DM
WHERE DM.Date >= @StartDate AND DM.Date <= @EndDate
AND DATENAME(dw,DM.Date) IN ('Thursday','Monday')
OPTION (MAXRECURSION 366)
您_really_不應該使用'BETWEEN'來(在所有,真的)與日期/時間值,_especially_在SQL Server(由於一些日期/時間特性)。如果你沒有日期表,通常的結果是用遞歸CTE生成它(導致一個'虛擬'表),這可能比迭代循環好得多。 –
謝謝,更新了答案.... –
感謝您的快速回復傢伙!將測試這個星期一上午。我對case語句有一些以前的SQL經驗,但是數據庫結構與im當前的環境完全不同。 –