这是一个远景,但是我希望你们当中的一个巫师能够帮助我。
我的组织保留日历表CalendarDays,其中包含两列,即Date和IsBizDay,它们是布尔值。
我想利用此表来计算另一个表(合同)之间的工作日,该表包含两列; StartDate和EndDate。
我想要的输出将是StartDate,EndDate,BizDaysBetween。
答案 0 :(得分:2)
select c.StartDate,
c.EndDate,
(select count(*)
from CalandarDays d
where d.Date >= c.StartDate
and d.Date < c.EndDate
and d.IsBizDay
) as BizDaysBetween
from Contracts c
答案 1 :(得分:0)
让我们的姿势pk
是Contracts
(或唯一字段或字段集)的主键。然后,您要查找的没有相关子查询的查询是:
select C.pk, C.StartDate, C.EndDate,
Coalesce( Count(d.Date), 0 ) as BizDaysBetween
from Contracts C
left outer join CalandarDays d
on d.Date >= c.StartDate
and d.Date < c.EndDate
and d.IsBizDay
group by C.pk, C.StartDate, C.EndDate
为什么要用联接代替相关子查询?
引用Wikipedia's Correlated subquery article:
在SQL数据库查询中,相关子查询(也称为同步子查询)是使用外部查询中的值的子查询(嵌套在另一个查询中的查询)。由于子查询可能会为外部查询处理的每一行评估一次,因此它可能效率不高。
记住要创建正确的索引。对于CalandarDays
,索引可以由(IsBizDay, Date)
组成。
为什么要退出并合并?
可能是因为它们不在范围内的任何工作日。