在电子表格中,用什么函数能自动求得两个日期之间的工作日?

在电子表格中,用什么函数能自动求得两个日期之间的工作日?,第1张

节假日没法统计,可以算出不含周六、周日的天数:=sumproduct(--(weekday(a1+row(indirect("1:"&(b1-a1))-1,2)<5))

直接用两个日期型的相减就可以了。

=NETWORKDAYS(A1,A2)+(HOUR(A2)-HOUR(A1))/24+(MINUTE(A2)-MINUTE(A1))/24/60

公式这么写吧。   把后面的小时算上。

这个公式会有部分情况计算出错,比如

2013/6/8 12:00   2013/6/10 18:00按上面公式计算就有问题了。上面公式有个前提,开始与结果日期都不能是周休,如果是周休的话必须是0:00分。

在excel中,通过将两个日期值进行减运算,可以得到这两个日期之间所间隔的具体天数;而将一个日期值与一个表示天数的常数相加减,则可以得到一个距离该日期x天的日期值。如:“2000/05/31”-“2000/05/01”得到31,“2000/05/01”加上90得到“2000/07/30”。这是excel提供的一个虽然简单却相当实用的日期计算功能。
然而,这一功能在实际工作中的局限性,使其无法满足更高层次的需要,特别是“工作日”这一概念逐渐在各领域被广泛应用的今天,许多工作都需要进行与之相关的计算。最常见的比如员工的出勤天数、交货期的计算、付款日的计算等等。excel为用户的这些需求提供了怎样的解决方案呢?
使用networkdays( )函数
networkdays(start_date,end_date,holidays)函数是专门用于计算两个日期值之间完整的工作日数值。这个工作日数值将不包括双休日和专门指定的其他各种假期。
networkdays(
)函数带有3个参数:start_date表示开始日期,end_date为终止日期,holidays表示作为特定假日的一个或多个日期。这些参数值既可以手工输入,也可以对单元格的值进行引用。下面以计算本年5月份共有多少个工作日为例,具体介绍networkdays(
)函数的用法:
在b1中输入起始日期“2000/05/01”,在b3中输入终止日期“2000/05/31”,在e2、e3中输入法定假日“2000/05/01”和“2000/05/02”。通过公式“=networkdays(b2,b4,e2:e3)”我们就可以方便地计算出5月份的工作日数了。当然,我们也可以直接输入公式“=networkdays(″2000-5-1″,″2000-6-1″,{″2000-5-1″,″2000-5-2″})”来得到这个结果。
使用workday( )函数
workday(start_date,days,holidays)函数是用来计算某日期(起始日期)之前或之后相隔指定工作日的某一日期的日期值。它也带有3个参数:start_date表示开始日期,days为
start_date 之前或之后不含周末及节假日的天数。days 为正值将产生未来日期;为负值产生过去日期,holidays表示作为特定假日的一个或多个日期。
假设我们在4月30日与客户签订了一份购销合同,合同规定90个工作日之后交货。那么,我们应该怎样计算到底哪一天交货呢?
在b1中输入起始日期“2000/05/01”,在b3中输入合同规定时间“90”,在e2、e3中输入法定假日“2000/05/01”和“2000/05/02”。通过公式“=workday(b2,b4,e2:e3)”,我们可以清楚的知道交货日期是“2000/09/05”。同上,我们还可以直接输入公式“=workday(″2000-5-1″,90,{″2000-5-1″,″2000-5-2″})”来进行计算。
加载扩展函数
已经迫不及待地打开excel进行尝试的朋友可能要嚷了,你说的这两个函数我这儿怎么没有啊?别急,点击“工具”菜单中的“加载宏”,找到“分析工具库”,给它一个小勾,再“确定”,ok!原来,这两个函数是嵌于“分析工具库”这个加载宏中的excel扩展函数,而excel在默认状态下是不加载这个加载宏的。
另外一个值得注意的问题是:将表示日期的单元格的数字格式设置成“日期”型,而表示天数的单元格则千万不要设置成“日期”型,否则你可能会看到“1900/02/21”
或“36774”这样奇怪的结果出现。

/
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:DATEPART(dw,
@begdt)-DATEPART(dw,
@begdt),最少0天
末一个星期的工作日数:DATEPART(dw,
@enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数
-
第一个星期的天数
-
末一个星期的天数)
/
7

5
+
第一个星期的工作日数
+
末一个星期的工作日数
/
--计算并返回两个日期间的工作小时数(工作日8)按周一到周五计算
--必须先SET
DATEFIRST
1
CREATE
FUNCTION
dboCalcWorkHours(@bdate
DATETIME,
@edate
DATETIME)
RETURNS
INTEGER
AS
BEGIN
DECLARE
@hours
INTEGER
IF
@@DATEFIRST
<>
1
OR
@bdate
>
@edate
RETURN
-1
SELECT
@hours
=
--如果终止日期与起始日期在同一个星期内,只需要计算有几天即可
CASE
WHEN
DATEPART(wk,
@edate-1)-DATEPART(wk,@bdate)
=
0
THEN
CASE
WHEN
DATEPART(dw,
@bdate)
>
5
THEN
0
WHEN
DATEPART(dw,
@edate-1)
>
5
THEN
6
-
DATEPART(dw,
@bdate)
ELSE
DATEPART(dw,
@edate-1)
-
DATEPART(dw,
@bdate)
+
1
END
--如果终止日期与起始日期在不同的星期内
--首先计算出除前后两个星期外完整的星期数

5
ELSE
(DATEDIFF(dd,@bdate,@edate)
-
(8-DATEPART(dw,
@bdate))
-
DATEPART(dw,
@edate-1))
/
7

5
--再加上第一个星期里的工作日数
+
CASE
WHEN
DATEPART(dw,
@bdate)
<
6
THEN
6
-
DATEPART(dw,
@bdate)
ELSE
0
END
--加上末一个星期里的工作日数
+
CASE
WHEN
DATEPART(dw,
@edate-1)>5
THEN
5
ELSE
DATEPART(dw,
@edate-1)
END
END

8
RETURN
@hours
END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13350662.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-19
下一篇 2023-07-19

发表评论

登录后才能评论

评论列表(0条)

保存