2013-08-06 7 views
-1

У меня есть таблица под названием Rateplan и данные выглядит следующим образом:Как обновить поле даты диапазоны

Например:

SELECT Rateplanid 
    , listingid 
    , rentalunitid 
    , validfromdate 
    , validtodate 
FROM Rateplan 
WHERE listingid = 721760 
    AND rentalunitid = 3027217 
ORDER BY 
     listingid 
    , rentalunitid 
    , validfromdate 
    , validtodate 

Rateplanid listingid rentalunitid validfromdate    validtodate 
    3  721760  3027217   2012-08-09 00:00:00.000 2012-10-18 00:00:00.000 
    22563  721760  3027217   2012-10-26 00:00:00.000 2012-11-27 00:00:00.000 
    25412  721760  3027217   2012-10-30 00:00:00.000 2012-10-30 00:00:00.000 
    25421  721760  3027217   2012-10-31 00:00:00.000 2012-11-27 00:00:00.000 
    26945  721760  3027217   2012-11-01 00:00:00.000 2012-11-07 00:00:00.000 
    34807  721760  3027217   2012-11-14 00:00:00.000 2012-11-27 00:00:00.000 
    35947  721760  3027217   2012-11-15 00:00:00.000 2012-11-15 00:00:00.000 
    43793  721760  3027217   2012-11-29 00:00:00.000 2013-01-03 00:00:00.000 
    62665  721760  3027217   2013-01-03 00:00:00.000 2199-12-31 00:00:00.000 

Логика Validtodate в текущей строке должны быть обновлены на основе Validfromdate следующей строки. Если значение ValidfromDate nextrow равно < = Validtodate текущей строки, то необходимо обновить его на один день меньше, чем значение ValisfromDate следующего ряда. Но мы также должны убедиться, что обновленный Validtodate должен быть меньше или равен validfromdate текущей строки.

ожидается ВЫВОД:

Rateplanid listingid rentalunitid validfromdate    validtodate 
    3  721760  3027217   2012-08-09 00:00:00.000 2012-10-18 00:00:00.000 
    22563  721760  3027217   2012-10-26 00:00:00.000 2012-10-29 00:00:00.000 
    25412  721760  3027217   2012-10-30 00:00:00.000 2012-10-30 00:00:00.000 
    25421  721760  3027217   2012-10-31 00:00:00.000 2012-10-31 00:00:00.000 
    26945  721760  3027217   2012-11-01 00:00:00.000 2012-11-07 00:00:00.000 
    34807  721760  3027217   2012-11-14 00:00:00.000 2012-11-14 00:00:00.000 
    35947  721760  3027217   2012-11-15 00:00:00.000 2012-11-15 00:00:00.000 
    43793  721760  3027217   2012-11-29 00:00:00.000 2013-01-02 00:00:00.000 
    62665  721760  3027217   2013-01-03 00:00:00.000 2199-12-31 00:00:00.000 
+1

В таблице Rateplan содержится первичный ключ? – Endrju

+0

@zxspectrum yes Я добавил первичный ключ Ratepaid на мой вопрос – peter

ответ

1
DECLARE @tmptable as table (listingid int, rentalunitid int, validfromdate datetime, processed int) 
DECLARE @listingid as int 
DECLARE @rentalunitid as int 
DECLARE @validtodate as date 
DECLARE @validfromdate as date 
DECLARE @validtodatenew as date 

set @listingid = 721760 
set @rentalunitid = 3027217 

INSERT INTO @tmptable 
SELECT 
     listingid 
    , rentalunitid 
    , validfromdate 
    , 0 as processed 
FROM Rateplan 
WHERE listingid = @listingid 
    AND rentalunitid = @rentalunitid 

WHILE (SELECT COUNT(*) from @tmptable where processed = 0) > 0 
BEGIN 

SET @validtodate = (SELECT top 1 validtodate from @tmptable where processed = 0) 
SET @validfromdate = (SELECT TOP 1 validfromdate from @tmptable where processed = 0 and validtodate = @validtodate) 

SET @validtodatenew = (SELECT top 1 validfromdate from Rateplan where listingid = @listingid and rentalunitid = @rentalunitid and validfromdate > @validtodate order by validfromdate asc) 

UPDATE rateplan 
SET validtodate = DATEADD(day,-1,@validtodatenew) 
WHERE listingid = @listingid and rentalunitid = @rentalunitid and validtodate = @validtodate and validfromdate = @validfromdate 

UPDATE @tmptable 
SET processed = 1 
WHERE listingid = @listingid and rentalunitid = @rentalunitid and validtodate = @validtodate and validfromdate = @validfromdate 
and processed = 0 

CONTINUE 
END 

Если у вас есть первичный ключ этой таблицы, было бы намного проще и менее подвержен ошибкам. В этом примере я буду использовать pkey в качестве первичного ключа.

DECLARE @tmptable as table (pkey int, validfromdate datetime, processed int) 
DECLARE @listingid as int 
DECLARE @rentalunitid as int 
DECLARE @validtodatenew as date 

set @listingid = 721760 
set @rentalunitid = 3027217 

INSERT INTO @tmptable 
SELECT 
    , pkey 
    , validfromdate 
    , 0 as processed 
FROM Rateplan 
WHERE listingid = @listingid 
    AND rentalunitid = @rentalunitid 

WHILE (SELECT COUNT(*) from @tmptable where processed = 0) > 0 
BEGIN 

SET @pkey = (Select top 1 pkey from @tmptable where processed = 0) 

SET @validfromdate = (Select validfromdate from @tmptable where pkey = @pkey) 

SET @validtodatenew = (SELECT top 1 validfromdate from Rateplan where listingid = @listingid and rentalunitid = @rentalunitid and validfromdate > @validfromdate order by validfromdate asc) 

UPDATE rateplan 
SET validtodate = DATEADD(day,-1,@validtodatenew) 
WHERE pkey = @pkey 

UPDATE @tmptable 
SET processed = 1 
WHERE pkey = @pkey and processed = 0 

CONTINUE 
END 

Edit: Понял я добавлял дату, а не вычитания даты.

+0

Я пробовал оба решения, и никто из них не работает – peter

+0

, и я предполагаю, что вы изменили pkey на Rateplanid? Каков ваш исход? Пожалуйста, дайте мне знать, если это была простая проблема синтаксиса или она изменила неправильное поле. – JamesMurray

+0

да я изменил pkey на rateplanid. Выход не приближается к тому, который мне нужен – peter

Смежные вопросы