有没有办法计算日期范围内的天数?

Is there a way to count days INSIDE a range of dates?

我是VB/SQL的新手,我几个月前才开始学习,但我能理解算法的逻辑,因为我以前做过一些Excel VBA.

实际上我正在设计一个数据库,我可以(希望)在这一年中跟进每位同事的 activity。

objective 的(每月)比率为 => 计费天数 /(可计费 + 不可计费 - 缺席)

上下文: 一个人可以是:在内部工作(不计费),或在外部工作(计费),或在假期(缺席)。

示例: 顾问 1:从 01/01/2019 到 01/06/2019 在外部工作, 从 02/06/2019 到 31/12/2019 在内部工作, 假期从 02/03/2019 到 15/03/2019

有没有办法获得例如 3 月份的可计费比率?

我创建了 4 个查询(也许太多了?) 3 个查询:[Consultant_ID] [Activity] [Beginning_Date] [End_Date] [比率:Datediff("d";[Beginning_Date]; [End_Date]).

对于每个查询:[Activity 标准]:一个在内部工作,一个在外部工作,一个缺席。

对于 [Beginning_Date] 和 [End_Date] 条件:<=[输入开始日期],>=[输入结束日期]

第 4 个查询 [Consultant ID] [Billable] [Non billable] [Absent](并计划添加 [RATIO])。

问题是:Datediff 会计算它找到的整个 activity 的日期,而不仅仅是我希望的 01/03/2019 和 31/03/2019 之间的日期。

我希望比率的输出为:所需期间的可计费天数/(可计费 + 不可计费 - 缺席)。

实际输出显示输入日期之间整个期间的可计费、不可计费和缺席天数

所以不是 31 位可收费,0 位不可收费,15 位缺席 它显示 180 人可计费,0 人不可计费,32 人缺席

抱歉这么久了post,这是我的第一次,非常感谢! 我已经为此苦苦挣扎了整整一个星期

我们首先需要计算出每行的 maxBegin 和 minEnd 日期

 SELECT
       *,
        (IIF (Beginning_Date > #3/1/2019#, Beginning_Date, #3/1/2019#)   ) as maxBegin,
        (IIF (End_Date < #3/31/2019#, End_Date, #3/31/2019#)   ) as minEnd,
        Datediff("d", maxBegin, minEnd) + 1 as theDiff
     FROM Planning
     Where Beginning_Date <= #3/31/2019#  AND End_Date >= #3/1/2019#

然后用它来计算持续时间。注意:DateDiff不计算两端,所以需要加上+1.

SELECT
   Consultant_ID,
   SUM(IIF (Activity = "Working Internally", Datediff("d", maxBegin, minEnd) +1, 0) ) as NonBillable,
   SUM(IIF (Activity = "Working Externally", Datediff("d", maxBegin, minEnd) +1, 0) ) as Billable,
   SUM(IIF (Activity = "Holidays", Datediff("d", maxBegin, minEnd) +1, 0) ) as Absent
FROM
   (
     SELECT
       *,
        (IIF (Beginning_Date > #3/1/2019#, Beginning_Date, #3/1/2019#)   ) as maxBegin,
        (IIF (End_Date < #3/31/2019#, End_Date, #3/31/2019#)   ) as minEnd
     FROM Planning
     Where Beginning_Date <= #3/31/2019#  AND End_Date >= #3/1/2019#
   ) as z

GROUP BY Planning.Consultant_ID;

最后,您需要通过参数将实际的 Begin/End 日期替换为 sql 到 运行 您的查询。另请注意,假期只有 14 天,而不是 15 天。

此外,您可以将比率计算直接添加到此 sql,并且只有一个查询。