如何使用日期范围期间(从和到的日期)添加和更新数据?

时间:2011-03-13 08:58:27

标签: sql-server

我有一张如下表格

第1阶段

表名:产品

Date_From   Date_To     Available
01/03/2011  05/03/2011  5
06/03/2011  15/03/2011  6

第二阶段

如果我使用以下数据更新上表

Date_From   Date_To     Available
04/03/2011  08/03/2011  4
10/03/2011  18/03/2011  2

第3阶段

当需要同时更新第2阶段数据时,我需要像这样输出Product表(第1阶段)

Date_From   Date_To     Available
01/03/2011  03/03/2011  5
04/03/2011  08/03/2011  4
06/03/2011  15/03/2011  6
10/03/2011  18/03/2011  2

希望得到你的帮助

编辑:

create table t (dt_from datetime,dt_to datetime, Available int)

insert into t values ('20110301','20110305',5)
insert into t values ('20110306','20110315',6)

在创建触发器后运行

--insert into t values ('20110304','20110308',4)
---insert into t values ('20110310','20110318',2)



SELECT *,ROW_NUMBER() OVER (ORDER BY dt_from) rn FROM t

CREATE TRIGGER my_tr ON t FOR INSERT
AS

UPDATE t SET dt_to=(SELECT TOP 1  DATEADD(d,-1,dt_from) FROM inserted t1 WHERE dt_from
                    BETWEEN t.dt_from AND t.dt_to AND t.Available<>t1.Available)
WHERE EXISTS (SELECT * FROM  inserted t1 WHERE dt_from
                    BETWEEN t.dt_from AND t.dt_to AND t.Available<>t1.Available)
UPDATE t SET dt_from=(SELECT TOP 1 DATEADD(d,1,dt_to) FROM inserted t1 WHERE dt_to
                    BETWEEN t.dt_from AND t.dt_to AND t.Available<>t1.Available)
WHERE EXISTS (SELECT * FROM  inserted t1 WHERE dt_to
                    BETWEEN t.dt_from AND t.dt_to AND t.Available<>t1.Available)

上面的代码工作正常,我得到以下结果

Date_From   Date_To     Available
01/03/2011  03/03/2011  5
04/03/2011  08/03/2011  4
09/03/2011  09/03/2011  6
10/03/2011  18/03/2011  2

但我面临的唯一问题是

insert into t values ('20110301','20110318',5)

没有得到正确的结果

我需要结果如下

Date_From   Date_To     Available
01/03/2011  18/03/2011  5

希望得到你的帮助

2 个答案:

答案 0 :(得分:1)

您应该有一个存储过程来获取您的值,然后根据日期决定是否需要INSERT或UPDATE ...

CREATE PROCEDURE dbo.InsertOrUpdateData
    @FromDate DATE, @ToDate DATE, @NewAvail INT
AS 
   IF EXISTS(SELECT * FROM dbo.YourTable
             WHERE Date_From = @FromDate AND Date_To = @ToDate)

      UPDATE dbo.YourTable
      SET Available = Available + @NewAvail
      WHERE Date_From = @FromDate AND Date_To = @ToDate

   ELSE

      INSERT INTO dbo.YourTable(Date_From, Date_To, Availability)
      VALUES(@FromDate, @ToDate, @NewAvail)

使用此存储过程,您可以调用

EXEC dbo.InsertOrUpdateData 
     @FromDate = '20110301', @ToDate = '20110305', @NewAvail = 42

如果这些日期已经存在,则该行将更新,如果这些日期不存在,则新行将插入。没有触发伏都教或类似的东西......

这就是你要找的东西吗?

答案 1 :(得分:0)

当您获得新行时,您需要执行以下操作:

使用新的ValidFrom和ValidTo日期 - 检查现有数据中的任何内容:

  • 有ValidFrom&lt; new Validfrom和ValidTo&gt; = new ValidFrom - 如果找到,则ValidTo应设置为新ValidFrom之前的1天。
  • 有ValidFrom&gt; = new ValidFrom和ValidTo&lt; = new ValidTo - 如果找到,您可能需要再次检查以查看移动日期是否会与之前的条目重叠
  • 具有ValidFrom&gt; = new ValidFrom和ValidFrom&lt; = new ValidTo和ValidTo&gt; = new ValidTo。此记录可能需要分成两部分。
  • 等 - 任何其他可复制的日期重叠组合......

我宁愿建议使用带有日期的新表 - 可用,每个产品每天一行,并使用可用的度量。这样,任何带有validfrom / validto的新条目都可以写出相关产品的相关日期的可用值。

DayID ProductId Available