如何:计算工作日-纯SQL方法。

恕我直言,以下内容不是解决特定问题的方法指导,而是更多的概念验证性内容,展示了SQL的可能性。

因此,让我们说问题是要计算工作日计数,该工作日计数定义为不包括周末和节假日的天数(在当前实施中为可选值)。

假设要计算的期间存储在与联系人关联的表中。

[tblPeriods]

keyPeriodID-自动编号(长),PK

keyContactID-Long,FK(tblContacts)

dteStart-日期/时间

dteEnd-日期/时间

目标是接收包含顺序日期的数据集,该日期属于表中存储的日期时段,不包括周末和节假日。 然后,一个简单的分组查询将返回所需的结果。

步骤1.获取记录。

为了使所有日期都落入时段,我们需要将[tblPeriods]与包含所有顺序日期的数据集进行外部联接。

显然,使用存储所有日期的表不是一个明智的选择。 ;)

更好地动态生成它。

显然,日历日期不过是1-31天数字,1-12个月数字和合理的年数范围的所有可能组合。 当然,不存在的日期(例如12月30日,有时是12月29日)必须省略。

这给出了使用以下数据集的笛卡尔联接的想法:

[tblDays]

lngDay-Long,PK-自然数设置为1-31

[tblMonts]

lngMonth-Long,PK-自然数设置为1-12

[tblYears]

lngYear-Long,PK-自然数集... :) ...让我们说2000-2014

以下查询会将这些值组合到2000-2014年的固定日历中,使用DateSerial()函数的功能将不存在的日期排除在外,以防止在非法的argumnets中包装日期。

查询:[qryFlatCalendar]


SELECT DateSerial(tblYears.lngYear,tblMonths.lngMonth,tblDays.lngDay) AS dteDate,
tblYears.lngYear, tblMonths.lngMonth, tblDays.lngDay
FROM tblYears, tblMonths, tblDays
WHERE tblDays.lngDay=Day(DateSerial([tblYears].[lngYear],[tblMonths].[lngMonth],[tblDays].[lngDay])); 

你可能感兴趣的:(数据库)