感谢您(提前)阅读此内容..
我有一个数据库,其中包含一个显示员工雇用日期的表格,我试图使用根据以下标准计算病假天数的查询创建一个PTO表:
每个工作年16天
如果雇用日期为,例如 2016年7月7日,则员工在2016年7月7日至2017年7月6日期间有16个病假日。 2017年7月7日,该员工再次有16天。
我试图想出最好的方法来计算这些信息,我不必每次完成一年时手动进入并更换该员工的新年。 (手动更改的记录太多)
我考虑使用DateAdd()函数,但感觉极端或......可能不是最好的方法。我想我必须创建一个新列来列出每年的新开始日期(每个员工),但我无法确定每年自动更新每个员工的最佳计算方法。
更不用说,这只适用于"活跃"员工,因为你需要工作至少3个月,让你生病或休假....
在过去的两个小时里,我一直在强调我的头脑,查看所有可能的公式以找到我可以使用的东西......大部分时间都归还给我每次手动做的事情......
任何想法都很受欢迎(你不知道)。
答案 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