我有一张如下表格
第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
希望得到你的帮助
答案 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 / validto的新条目都可以写出相关产品的相关日期的可用值。
DayID ProductId Available