Отрегулируйте дату в соответствии с сохраненным днем ​​недели - PullRequest
4 голосов
/ 11 мая 2011

У меня есть таблица, в которой хранится дата начала и название дня недели, к которому относится дата начала.Я не знаю почему, это плохой дизайн, но я его не создавал и не могу его изменить.Поэтому, конечно, теперь у нас есть некоторые даты, которые не совпадают с днем ​​недели.Что еще хуже, день недели правильный, а дата начала неверная.Поэтому мне нужно настроить даты так, чтобы StartDate каждой строки попадал в DayOfWeek этой строки.Мы можем предположить, что StartDate всегда является минимальным значением, поэтому целевая дата будет первой [DayOfWeek] после текущей установленной StartDate.

Так, например, у меня есть строки, которые выглядят следующим образом (23.08.10 былоПонедельник, 29.08.10 было Солнцем):

StartDate    DayOfWeek
-----------------------
2010-08-23   Monday
2010-08-23   Tuesday
2010-08-29   Thursday

В строке 2 вы можете видеть, что дата должна быть вторником, но на самом деле это понедельник.Мне нужно закончить с этим:

StartDate    DayOfWeek
-----------------------
2010-08-23   Monday
2010-08-24   Tuesday
2010-09-02   Thursday

Я всегда борюсь с датами, но SQL тоже не самый сильный мой навык.Спасибо.

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Кража настроек geofftnz и надежда, что это «умный» метод, о котором он думал:

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')

select * from @baddata

;with Nums as (
    select 0 as n union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6
)
update b
set StartDate = DATEADD(day,Nums.n,StartDate)
from
    @baddata b
        inner join
    Nums
        on
            DATENAME(weekday,DATEADD(day,Nums.n,StartDate)) = [DayOfWeek]

select * from @baddata

В третьей строке я получаю дату в сентябре, а не в августе, но я думаю, что результат верный, а результат выборки неверный?

3 голосов
/ 11 мая 2011

Будет разумный способ сделать это и способ "давайте просто выберем некоторые данные".Вот последний:

-- 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
...