将有一个聪明的方法来做这件事和“让我们把一些数据扔掉”的方式。这是后者:
-- here's our bad data we want to fix:
declare @baddata table(StartDate datetime, [DayOfWeek] varchar(20))
insert into @baddata values('2010-08-23','Monday')
insert into @baddata values('2010-08-23','Tuesday')
insert into @baddata values('2010-08-29','Thursday')
-- we need to create a table containing valid date+day pairs for the
-- range of our bad data
-- find max and min dates from our bad data
declare @MinDate datetime
declare @MaxDate datetime
select @MinDate = min(StartDate), @MaxDate = max(StartDate) from @baddata
-- offset max date by 7 days (which is the most we'll need to correct the date by)
set @MaxDate = dateadd(day,7,@MaxDate)
-- create a table matching dates to days
declare @dates table([Date] Datetime, [DayOfWeek] varchar(20))
declare @i int
-- populate the table with enough days to cover the range of your bad data
set @i = 0
while @i <= datediff(day,@MinDate, @MaxDate)
begin
insert into @dates
select dateadd(day, @i, @MinDate), datename(dw,dateadd(day, @i, @MinDate))
set @i = @i + 1
end
-- show us our table
select * from @dates
-- update the ones with incorrect days
update bd
set
bd.StartDate = ( -- find the next date with a matching day
select top 1
d.[Date]
from
@dates d
where
d.[DayOfWeek] = bd.[DayOfWeek] and
d.[Date] >= bd.StartDate
order by
d.[Date]
)
from
@baddata bd
inner join @dates d on
d.[Date] = bd.StartDate
where
bd.[DayOfWeek] != d.[DayOfWeek] -- date names don't match
select * from @baddata