如何根据 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
感谢您(提前)阅读本文..
我有一个包含 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