有没有办法计算一系列日期?

问题描述 投票:-3回答:1

我是VB / SQL的初学者,几个月前我刚开始学习,但我可以理解算法的逻辑,因为我曾经做过一些Excel VBA。

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

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

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

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

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

有没有办法让3月的Billable比率为例?

我创建了4个查询(可能太多了?)3个查询:[Consultant_ID] [Activity] [Beginning_Date] [End_Date] [比率:Datediff(“d”; [Beginning_Date]; [End_Date])。

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

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

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

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

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

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

因此,而不是31 Billable,0 Non billable,15 Absent It显示180 Billable,0 Non Billable,32 Absent

对不起,很长的帖子,实际上是我的第一个,非常感谢你!我整整一周都在苦苦挣扎

date ms-access count days
1个回答
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;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.