0

SRC_RECORD (src からのレコード)

Str_id  Eff_From_Dt    Eff_to_dt    str_code    Action done of source table
12        01-Sep-13   01-Feb-14J         161    Reject it
12        01-Sep-13   31-Dec-13J         161    Insert
12        05-Jan-14   14-Jan-14J         161    Insert

TGT_RECORD で利用可能なレコード

Str_id  Eff_From_Dt    Eff_to_dt    str_code
12        08-Jul-13   31-Aug-13J         161
12        01-Jan-14   04-Jan-14J         161
12        15-Jan-14   30-Jan-14J         161

上記をストアドプロシージャで作成しました。ここでは、日付の重複を確認しています

(@start_dt between effective_from_dt and effective_to_dt) OR
(@end_dt between effective_from_dt and effective_to_dt)

しかし、期待した結果が得られません。(01-Sep-13, 01-Feb-14)からのインターバルを拒否したいのはsrc、 の既存の利用可能なレコードと重複しているためですtgt

助けてください、困っています。

4

2 に答える 2

0

期間をテストして、テーブル内の既存の期間と重複するかどうかを確認しているようです。

少し単純化して、1 つのチェックを見てみましょう。1 つの期間 s1-e1 と 2 番目の期間 s2-e2 を呼び出します。

現時点では、BETWEENステートメントで、s2 が s1 と e1 の間にあるか、または e2 が s1 と e1 の間にあるかを確認しています。最初の 3 つのケースを正常にキャッチできました。

ケース1

        s1       e1
        |--------|   
s2        e2
|---------|

ケース 2

     s1       e1
     |--------|
         s2        e2
         |---------|

ケース 3

 s1                   e1
 |--------------------|
    s2           e2
    |------------|

ただし、キャッチできないケースが 1 つあります。既存の期間 s1-e1 が、テストしている期間内に完全に収まる可能性を考慮してください。s2 も e2 も s1 と e1 の間にはありませんが、期間は確実に重なっています。

ケース 4

        s1       e1
        |--------|
    s2                 e2
    |------------------|

ANDWHEREの場合の状況を確認するには、句の条件を調整する必要があります。s2 < s1e2 > e1

あなたの例では、範囲には と の両方が含まれているため、範囲を01-Sep-13 -> 01-Feb-14拒否する必要があります。上記のケース 4 を確認するようにクエリを変更すると、この重複も必要に応じて拒否されます。01-Jan-14 -> 04-Jan-1415-Jan-14 -> 30-Jan-14

于 2013-07-30T07:40:16.343 に答える
0

sqlserver 2000 を使用しているようです。これに適したソリューションを次に示します。「良い」行のみを選択します

declare @TGT_RECORD table (Str_id INT, Effective_From_Dt DATE, Effective_to_dt DATE, str_code INT)
insert @TGT_RECORD values
(12,        '08-Jul-13','31-Aug-13',   161),
(12,        '01-Jan-14','04-Jan-14',   161),
(12,        '15-Jan-14','30-Jan-14',   161)

declare @SRC_RECORD table (Str_id INT, Effective_From_Dt DATE, Effective_to_dt DATE, str_code INT)
insert @SRC_RECORD values
(12,        '01-Sep-13','01-Feb-14',161),
(12,        '01-Sep-13','31-Dec-13',161),
(12,        '05-Jan-14','14-Jan-14',161)

select t1.Str_id, t1.Effective_From_Dt Eff_from_Dt, t1.Effective_to_dt Eff_to_Dt, t1.str_code--, case when a.chk is not null then 'Reject' else 'Insert' end Action
from @SRC_RECORD t1
where not exists 
(
select 1 from 
@TGT_RECORD t2
where 
t1.Effective_From_Dt between t2.Effective_From_Dt and t2.Effective_to_dt
or t1.Effective_to_Dt between t2.Effective_From_Dt and t2.Effective_to_dt
or t2.Effective_From_Dt between t1.Effective_From_Dt and t1.Effective_to_dt
)
于 2013-07-30T09:49:51.147 に答える