如何处理横截面日期

时间:2013-07-30 06:37:50

标签: sql sql-server

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中的现有可用记录重叠。

请帮助我,我遇到了麻烦。

2 个答案:

答案 0 :(得分: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 < s1e2 > e1

时检查情况

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

答案 1 :(得分: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
)