有没有一种方法可以计算日期范围内的天数?

时间:2019-03-26 17:00:38

标签: date ms-access count days

我是VB / SQL的初学者,几个月前才开始学习,但是当我做一些Excel VBA时,我可以理解算法的逻辑。

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

目标是使(每月)比率=> 计费天数/(计费+非计费-缺席)

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

  • 我有一个[Planning]表,其中存储以下数据:[Consultant_ID](链接到另一个表[Consultant],[Activity](具有上述三个选项的列表),[Beginning_Date],[End_Date] 。

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

例如,是否可以使用3月的计费比率?

我创建了4个查询(可能太多了?) 3个查询:[顾问ID] [活动] [开始日期] [结束日期] [比率:Datediff(“ d”; [开始日期]; [结束日期])。

对于每个查询:[活动条件]:一个内部工作,一个外部工作,一个不存在。

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

第4个查询[顾问ID] [可结算] [不计费] [不存在](并计划添加[比率])。

问题是:Datediff会计算发现的整个活动的日期,而不仅仅是我希望的01/03/2019到31/03/2019之间的日期。

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

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

因此代替了31个计费对象,0个非计费对象,15个缺席 它显示180个可计费,0个非可计费,32个不存在

很抱歉,很长的帖子,这实际上是我的第一篇,非常感谢! 我整整一个星期都在为此苦苦挣扎

1 个答案:

答案 0 :(得分:0)

我们首先需要找出每一行的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;

最后,您需要通过参数将实际的开始/结束日期替换为sql以运行查询。另外请注意,假期只有14个,而不是15个。

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