检查两个不同的表sql中的日期重叠

时间:2015-01-07 15:20:59

标签: sql oracle

我有两个表一个(A)包含假日日期,第二个(B)包含出发,到达日期和提前期。我想要的是从提前期中扣除假期数。

所以我想要B的每个记录,看看A的记录在出发和到达日期之间有多少,然后从提前期扣除。

这对SQL是否可行?

伪SQL代码:

Select 
    B.Lead time - SUM(CASE WHEN A.Holiday BETWEEN B.ArrDate AND B.DepDate 
                              then 1
                              ELSE 0
                        )
from A, B

3 个答案:

答案 0 :(得分:0)

FROM a, b会给你一个交叉加入(笛卡尔积),这可能不是你想要的。我想您需要LEFT JOINGROUP BY的提前期:

SELECT b.lead_time - SUM( CASE WHEN a.holiday BETWEEN b.arrDate AND b.depDate THEN 1 ELSE 0 END )
  FROM b LEFT JOIN a
    ON a.holiday BETWEEN b.arrDate AND b.depDate
 GROUP BY b.lead_time

只要lead_time中的b应该是唯一的,那就可行。

答案 1 :(得分:0)

我认为这将更加普遍:

SELECT 
A.DEP_DATE,A.ARR_DATE,(LEAD_TIME-X.CNT)  FROM A, 
(SELECT DEP_DATE,ARR_DATE, COUNT(*) AS CNT FROM A,B WHERE B.HOLIDAYS BETWEEN A.DEP_DATE AND A.ARR_DATE
GROUP BY DEP_DATE,ARR_DATE) X
WHERE
A.DEP_DATE=X.DEP_DATE 
AND 
A.ARR_DATE=X.ARR_DATE

答案 2 :(得分:0)

我倾向于使用相关子查询来回答这个问题:

Select (B.Leadtime -
        (select count(*)
         from a
         where a.Holiday between b.ArrDate AND b.DepDate
        )
       )
from B;

您的假期表应具有holiday的索引。