日期:2014-05-19  浏览次数:20409 次

高手指教则么用存储过程 计算某时间段内的 天数(除去周六日及国家法定假日)?
现在在做一个考前模块,客户要求,要去掉节假日,统计某时间段内缺勤的次数?请问怎么处理啊?

------解决方案--------------------
转一个邹建的:

if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[f_workday] ') and xtype in (N 'FN ', N 'IF ', N 'TF '))
drop function [dbo].[f_workday]
GO

/*--得到指定日期之间的工作日天数

2004.12 修正了计算不准确的问题
增加了处理,避免处理过程受 SET DATEFIRST 设置的影响
--邹建 2004.06(引用请保留此信息)--*/

/*--调用示例

select dbo.f_workday( '2004-06-20 ', '2004-06-27 ')
select dbo.f_workday( '2004-12-1 ', '2004-12-31 ')
select dbo.f_workday( '2004-12-1 ', '2005-1-1 ')
select dbo.f_workday( '2004-12-1 ', '2005-1-2 ')
select dbo.f_workday( '2004-12-1 ', '2005-1-3 ')
--*/
create function f_workday(
@dt_begin datetime,
@dt_end datetime
)returns int
as
begin
declare @dt datetime,@re int,@i int
if @dt_begin> @dt_end
select @dt=@dt_begin
,@dt_begin=@dt_end
,@dt_end=@dt
select @i=datediff(day,@dt_begin,@dt_end)+1
,@re=@i/7*5
,@dt=dateadd(day,@i/7*7,@dt_begin)
while @dt <=@dt_end
begin
select @re=case
when (@@datefirst+datepart(weekday,@dt)-1)%7 in(0,6)
then @re else @re+1 end
,@dt=@dt+1
end
return(@re)
end
go

------解决方案--------------------
建议,周六周日可以用日期判断,国家法定假日用一个表来存放