我已经编写了2个查询,我需要考虑将它们组合成我认为必须是游标的内容。第一个查询看起来像这样 -
DECLARE @Date DATETIME
SET @Date = '12-July-2014'
SELECT Date AS SaturdayDate
, DayOfWeek
FROM (
SELECT DATE
, DATENAME(DW,DATE) as DayOfWeek
, ROW_NUMBER() OVER (ORDER BY Date) AS rownum
FROM tblCalender
WHERE DATENAME(DW,DATE) = 'Saturday'
AND Date > @Date
) AS t
WHERE t.rownum % 4 = 0
AND DATEPART(YEAR, Date) = DATEPART(Year, GETDATE())
每年第4个星期六返回7月12日剩余的一年 -
SaturdayDate |DayOfWeek
2014-08-09 00:00:00.000 |Saturday
2014-09-06 00:00:00.000 |Saturday
2014-10-04 00:00:00.000 |Saturday
2014-11-01 00:00:00.000 |Saturday
2014-11-29 00:00:00.000 |Saturday
2014-12-27 00:00:00.000 |Saturday
这非常适合我的需要,然后我需要使用上面的结果作为@SaturdayDate
参数运行更新查询(需要它循环并更新每条记录)
UPDATE dbo.tblStaffRota
SET StartTime = '11:00:00'
WHERE (EmployeeID IN ('JJJ','HSW', 'GPH', 'DVD'))
AND (StartTime = '10:30:00')
AND (Date BETWEEN @SaturdayDate - 6 AND @SaturdayDate)
因此,更新查询将循环显示第一个查询的结果,使用新的开始时间更新每个日期,不确定如何使用此进程以及我发现的所有答案都没有安静帮助。希望这很清楚。感谢
*附加说明 - 更新需要查看上周出现的每个星期六的日期,并随着开始时间的变化而变化。
正在使用的表格示例。
如果星期六在列表中,更新将在18日和19日更改开始时间。
答案 0 :(得分:1)
看起来你需要类似的东西(注意:下面的脚本尚未经过测试)..
根据发布的样本数据修改:
DECLARE @Date DATETIME
SET @Date = '12-July-2014'
UPDATE STAFFROTA
SET StartTime = '11:00:00'
FROM dbo.tblStaffRota STAFFROTA
INNER JOIN
(
SELECT DATEADD(d, -6, Date) AS SaturdayDateStart, Date AS SaturdayDateEnd
, DayOfWeek
FROM (
SELECT DATE
, DATENAME(DW,DATE) as DayOfWeek
, ROW_NUMBER() OVER (ORDER BY Date) AS rownum
FROM tblCalender
WHERE DATENAME(DW,DATE) = 'Saturday'
AND Date > @Date
) AS t
WHERE t.rownum % 4 = 0
AND DATEPART(YEAR, Date) = DATEPART(Year, GETDATE())
) SAT
ON STARFFROTA.[Date] BETWEEN SAT.SaturdayDateStart AND SAT.SaturdayDateEnd
WHERE (STARFFROTA.EmployeeID IN ('JJJ','HSW', 'GPH', 'DVD'))
AND (STARFFROTA.StartTime = '10:30:00')