如何根据 MS Access 中的雇用日期计算就业年份

How to calculate employment year based on hire date in MS Access

感谢您(提前)阅读本文..

我有一个包含 table 显示员工雇用日期的数据库,我正在尝试使用基于以下条件计算病假天数的查询来创建 PTO table:

每个工作年 16 天

如果雇用日期是 ,例如 7/7/2016,则员工在 7/7/2016 和 7/6/2017 之间有 16 个病假. 2017 年 7 月 7 日,员工再次有 16 天的工作时间。

我正在尝试想出计算此信息的最佳方法,这样我就不必在该员工每次完成一年时手动进入并更改新的年份。 (记录太多,无法手动更改)

我考虑过使用 DateAdd() 函数,但感觉很极端或者...也许不是执行此操作的最佳方法。我想我必须创建一个新列来列出每年(每个员工)的新开始日期,但我无法弄清楚每年自动更新每个员工的最佳计算是什么。

更不用说,这仅适用于 "active" 名员工,因为您需要至少工作 3 个月才能请病假或休假....

在过去的 2 个小时里,我一直在紧张地寻找所有可能的公式,以找到我可以使用的东西……大部分都让我每次都手动做一些事情……

非常感谢任何想法(你不知道)。

以Excel为例,将开始日期列表放入Column A

B1中输入:

=IF(DATE(YEAR(NOW()),MONTH(A1),DAY(A1))>TODAY(),
    DATE(YEAR(NOW()),MONTH(A1),DAY(A1)),
    DATE(YEAR(NOW()),MONTH(A1),DAY(A1)))

C1中输入:

=DATE(YEAR(B1)+1,MONTH(A1),DAY(A1))-1

...并填写列表。

每个员工给你“current employment year”。研究这些公式,了解它们的工作原理,实际上非常简单。

这些公式(稍作修改,例如 Access 公式不以 = 开头)可用作 Access 查询的条件:您想要计算每位员工请病假的天数,其中:

sick_date  >= (the start of the employment year) AND
sick_date < (the end of the employment year) 

没有理由为此通过 Excel。

首先,创建一个列出员工工作年限的查询:

SELECT DISTINCT 
    PersonID, 
    DateAdd("yyyy", 10 * Abs([Deca].[id] Mod 10) + Abs([Uno].[id] Mod 10),[HireDate]) AS YearStart, 
    IIf([LeaveDate] >= DateAdd("yyyy", 1, [YearStart]),DateAdd("d", -1, DateAdd("yyyy", 1 ,[YearStart])), [LeaveDate]) AS YearEnd
FROM 
    Personer, 
    MSysObjects AS Uno, 
    MSysObjects AS Deca
WHERE 
    DateAdd("yyyy", 10 * Abs([Deca].[id] Mod 10) + Abs([Uno].[id] Mod 10), [HireDate]) < [LeaveDate];

将其保存为 qPersonYear。输出将是这样的:

PersonID    YearStart   YearEnd
05  2000-04-18  2001-04-17
05  2001-04-18  2002-03-31
07  2000-11-01  2001-10-31
07  2001-11-01  2002-10-31
07  2002-11-01  2003-10-31
07  2003-11-01  2004-10-31
07  2004-11-01  2005-10-31
07  2005-11-01  2006-10-31
07  2006-11-01  2007-10-31
07  2007-11-01  2008-10-31
07  2008-11-01  2009-04-30
10  2001-12-01  2002-11-30
10  2002-12-01  2003-11-30
10  2003-12-01  2004-11-30
10  2004-12-01  2005-11-30
10  2005-12-01  2006-11-30
10  2006-12-01  2007-11-30
10  2007-12-01  2008-11-30
10  2008-12-01  2009-11-30
10  2009-12-01  2010-05-31
2   2000-11-01  2001-09-09
8   2001-04-01  2001-10-31

创建另一个查询 qPersonSickDate,以检索病假。

唯一需要的字段是 PersonID 和 SickDate。

最后,创建一个查询来计算病假:

SELECT 
    qPersonYear.PersonID, 
    qPersonYear.YearStart, 
    qPersonYear.YearEnd, 
    Count(qPersonSickDate.SickDate) AS SickDays
FROM 
    qPersonYear 
LEFT JOIN 
    qPersonSickDate 
    ON qPersonYear.PersonID = qPersonSickDate.PersonID
WHERE 
    qPersonSickDate.SickDate Between [YearStart] And [YearEnd] 
GROUP BY 
    qPersonYear.PersonID, 
    qPersonYear.YearStart, 
    qPersonYear.YearEnd;

而且,瞧,你有完整且经过净化的输出:

PersonID    YearStart   YearEnd SickDays
05  2000-04-18  2001-04-17  8
07  2000-11-01  2001-10-31  2
07  2001-11-01  2002-10-31  6
07  2002-11-01  2003-10-31  4
07  2003-11-01  2004-10-31  6
07  2004-11-01  2005-10-31  1
07  2005-11-01  2006-10-31  1
07  2006-11-01  2007-10-31  4
07  2007-11-01  2008-10-31  5
07  2008-11-01  2009-04-30  1
10  2001-12-01  2002-11-30  8
10  2002-12-01  2003-11-30  11
10  2003-12-01  2004-11-30  6
10  2004-12-01  2005-11-30  6
10  2005-12-01  2006-11-30  8
10  2006-12-01  2007-11-30  4
10  2007-12-01  2008-11-30  3
10  2008-12-01  2009-11-30  1
2   2000-11-01  2001-09-09  17
8   2001-04-01  2001-10-31  1