2011-03-13 22 views
0

我有像下面如何使用日期範圍期限(日期和時間)添加和更新數據?

階段1

表名的表:產品

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

階段2

如果我更新上述具有低於數據

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

表第3階段

我需要產品表(階段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 

希望能對您有所幫助

編輯與階段更新在同一時間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

它很難明白你正在嘗試做的,爲什麼有替代數據而不是插入2個新行更新表? –

+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼樣本」按鈕(「{}」),以精確地格式化和語法突出顯示它! –

+0

becasuse因爲我想用新數據更新表(Availaility) – user475464

回答

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 

如果這些日期已經存在,該行會更新,如果不存在這些日期,新的行會插入。沒有觸發巫毒或任何類似的需要....

這是你在找什麼?

+0

在這種情況下我們如何更新可用性?並顯示數據如階段3 – user475464

0

當你得到一個新的行,你需要做到以下幾點:

使用新ValidFrom和ValidTo日期 - 檢查任何要麼是現有的數據:

  • 擁有ValidFrom <新Validfrom和ValidTo> = new ValidFrom - 如果找到了,ValidTo應該設置爲新的ValidFrom前1天。
  • 擁有ValidFrom> =新ValidFrom和ValidTo < =新ValidTo - 如果找到了,你可能需要做一次檢查,看看是否移動會的日期重疊以前的條目
  • 擁有ValidFrom> =新ValidFrom和ValidFrom < =新的ValidTo和ValidTo> =新的ValidTo。這個記錄可能需要分成兩部分。
  • 等 - 日期的任何其他concievable組合重疊...

我寧願建議使用新表的一天 - 提供,給予每人每天的產品一行,與現有的措施。這樣,任何帶有validfrom/validto的新條目都可以爲相關產品的相關日期編寫可用值。

DayID ProductId Available

相關問題