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

好像您正在使用 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 回答
0

听起来您正在测试一个时间段以查看它是否与表中的任何现有时间段重叠。

让我们简化一下,看看一个检查 - 调用一个时间段 s1-e1 和第二个时间段 s2-e2。

目前,在您的BETWEEN声明中,您正在检查 s2 是否在 s1 和 e1 之间,或者 e2 是否在 s1 和 e1 之间。您成功捕获了前三个案例。

情况1

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

案例2

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

案例3

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

但是,有一种情况你没有抓住。考虑现有时间段 s1-e1 可能完全落在您正在测试的时间段内的可能性。s2 和 e2 都不在 s1 和 e1 之间,但时间段肯定是重叠的!

案例4

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

您需要调整WHERE子句条件以检查s2 < s1AND时的情况e2 > e1

在您的示例中,该范围01-Sep-13 -> 01-Feb-14应该被拒绝,因为它包含两者01-Jan-14 -> 04-Jan-1415-Jan-14 -> 30-Jan-14在其中。如果您修改查询以检查上述情况 4,则此重叠也将根据需要被拒绝。

于 2013-07-30T07:40:16.343 回答