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
中的现有可用记录重叠。
请帮助我,我遇到了麻烦。
答案 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 < s1
和e2 > e1
在您的示例中,应拒绝范围01-Sep-13 -> 01-Feb-14
,因为其中包含01-Jan-14 -> 04-Jan-14
和15-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
)