2011-03-13 3 views
0

Iは日付範囲期間(日付と時刻)を使用してデータを追加および更新する方法は?

以下ステージ1

テーブル名のようなテーブルがあります。私は以下のデータ

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

でテーブルの上に更新する場合商品

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

ステージ2

をステージ3

とき同時に、ステージ2のデータとアップデートが

あなたの助け

EDITを願い

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 

私は、このような製品テーブルの出力(第1段階)が必要です:

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 

このストアドプロシージャでは

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) 

...

+2

その理由の代わりに2つの新しい行を挿入する置換データでテーブルを更新し、あなたがやろうとしているかを理解するのは難しいですか? –

+0

コード、XML、またはデータサンプルを投稿する場合は、テキストエディタでこれらの行を強調表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックして、フォーマットをして構文を強調してください! –

+0

私は新しいデータ(Availaility)でテーブルを更新したいから – user475464

答えて

1

あなたはおそらくあなたの値をとり、その後、INSERTまたはUPDATEが日付に基づいて、必要とされているかどうかを決定するストアドプロシージャを持つべきであるあなたの助けを期待して、これらの日付が既に存在する場合は、

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

を呼び出すことができ、その行はは、これらの日付が存在しない場合は、新しい行がに挿入される、に更新されます。トリガーブードゥーや必要なものはありません....

あなたはそれを探していますか?

+0

の可用性をどのように更新するのですか?ステージ3のようなデータを表示する – user475464

0

あなたは次のことを行う必要があり、新しい行を取得:新しいValidFromとValidTo日付を使用して

を - のいずれか何のために既存のデータを確認する:

  • がValidFrom <新しいValidfromを持っており、 ValidTo> = new ValidFrom - 見つかった場合、新しいValidFromの前にValidToを1日に設定する必要があります。
  • ValidFrom> =新しいValidFromとValidTo < =新しいValidToを持っています - 見つかった場合、あなたは日付を移動すると、以前のエントリ
  • に重なっでしょうかどうかを確認するためにもう一度ご確認くださいする必要があるかもしれませんValidFrom> =新しいValidFromとValidFromを持っています< =新しいValidToとValidTo> =新しいValidTo。このレコードは2つに分割する必要があります。
  • など - 、利用可能利用できる指標で、一日あたりの製品ごとに1行を与える - 日付の他concievable組み合わせが重なって...

は、私はむしろ一日で新しいテーブルを使用することをお勧めします。こうすることで、validfrom/validtoを持つ新しいエントリであれば、関連する製品の関連日に使用可能な値を書き込むことができます。

DayID ProductId Available

関連する問題