使用工作日表的标准SQL中两个日期之间的工作日

时间:2019-02-26 19:43:36

标签: sql google-bigquery

这是一个远景,但是我希望你们当中的一个巫师能够帮助我。

我的组织保留日历表CalendarDays,其中包含两列,即Date和IsBizDay,它们是布尔值。

我想利用此表来计算另一个表(合同)之间的工作日,该表包含两列; StartDate和EndDate。

我想要的输出将是StartDate,EndDate,BizDaysBetween。

2 个答案:

答案 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)

让我们的姿势pkContracts(或唯一字段或字段集)的主键。然后,您要查找的没有相关子查询的查询是:

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)组成。

为什么要退出并合并?

可能是因为它们不在范围内的任何工作日。