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

时间:2018-04-08 20:44:47

标签: ms-access database-design date-arithmetic calculation

感谢您(提前)阅读此内容..

我有一个数据库,其中包含一个显示员工雇用日期的表格,我试图使用根据以下标准计算病假天数的查询创建一个PTO表:

每个工作年16天

如果雇用日期为,例如 2016年7月7日,则员工在2016年7月7日至2017年7月6日期间有16个病假日。 2017年7月7日,该员工再次有16天。

我试图想出最好的方法来计算这些信息,我不必每次完成一年时手动进入并更换该员工的新年。 (手动更改的记录太多)

我考虑使用DateAdd()函数,但感觉极端或......可能不是最好的方法。我想我必须创建一个新列来列出每年的新开始日期(每个员工),但我无法确定每年自动更新每个员工的最佳计算方法。

更不用说,这只适用于"活跃"员工,因为你需要工作至少3个月,让你生病或休假....

在过去的两个小时里,我一直在强调我的头脑,查看所有可能的公式以找到我可以使用的东西......大部分时间都归还给我每次手动做的事情......

任何想法都很受欢迎(你不知道)。

2 个答案:

答案 0 :(得分:1)

以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查询的条件:您想要计算每个员工使用的病假天数,其中:

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

答案 1 :(得分:0)

没有理由通过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