如何更新日期字段范围

时间:2013-08-06 20:14:04

标签: sql sql-server tsql sql-server-2008-r2

我有一个名为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进行更新。  如果nextrow的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

1 个答案:

答案 0 :(得分: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

编辑:已实现我正在添加日期而不是减去日期。