-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 <= 当前行的 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
4

1 回答 1

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

编辑:意识到我是在添加日期而不是减去日期。

于 2013-08-07T16:34:38.623 回答