求助写一个根据年月自动计算出当月有多少天工作日的自定义函数,只需要考虑周末,不用考虑法定节假日

z418841875 2015-09-29 09:58:16
求助写一个根据年月自动计算出当月有多少天工作日的自定义函数,需要用while循环,只需要考虑周末,不用考虑法定节假日。

如传入‘201509’,算出2015年9月的工作日天数,找了好久都只有根据开始日期和结束日期的
...全文
312 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Tiger_Zhao 2015-09-30
-- 参数
DECLARE @ym varchar(6)
SET @ym = '201509'
-- 实现
SET DATEFIRST 1

DECLARE @firstDay datetime
SET @firstDay = CONVERT(datetime,@ym+'01',112)

SELECT COUNT(*) 工作日数
FROM (
SELECT DATEADD(day,number,@firstDay) dt
FROM master..spt_values
WHERE type = 'p'
AND number < 31
) t
WHERE month(dt) = month(@firstDay)
AND DATEPART(weekday,dt) < 6

   工作日数
-----------
22
回复
卖水果的net 2015-09-30



declare @month varchar(10) = '201509'
declare @startdate varchar(10)
declare @enddate varchar(10)

set @startdate = STUFF(@month,5,0,'-') + '-01'
set @enddate = convert(varchar(10),DATEADD(month,1,@startdate),121)
select COUNT(*) as '非周末天数'
    -- DATEADD(day, number ,@startdate) 
from master..spt_values 
where type ='p' and number < DATEDIFF(day,@startdate,@enddate)
and  DATEPART(DW, DATEADD(day, number ,@startdate)) not in (7,1)


非周末天数
-----------
22

(1 行受影响)


回复
zbdzjx 2015-09-30
declare @ym varchar(6)
select @ym='201509'

select COUNT(*) from (
select DATEADD(day, number, convert(datetime, @ym+'01')) allday
from master..spt_values 
where type='p' and number<31
) aa
where DATEPART(weekday, allday) not in (1,7) and DATEPART(MONTH, allday)=CONVERT(int, substring(@ym,5,2))
回复
reenjie 2015-09-30
可以试一下下面的sql

create function [dbo].[func_GetNumOfWorkDays](
@yearMonth varchar(6)
)
returns int
begin
declare @year int=left(@yearMonth,4),         --截取年份
        @month int=right(@yearMonth,2),       --截取月份
        @startDay date='',                    --该月开始日期
        @endDay date='',                      --该月结束日期
        @start int,                           --该月开始日期对应的一周中的第几天(注意星期天对应的是1,而周六对应的是7)
        @end int                              --该月结束日期对应的一周中的第几天(注意星期天对应的是1,而周六对应的是7)
set @startDay=convert(varchar(4),@year)+'-'+convert(varchar(4),@month)+'-01'
if(@month=12)
begin
set @endDay=dateadd(day,-1,convert(varchar(4),@year+1)+'-01-01')
end
else
begin
set @endDay=dateadd(day,-1, convert(varchar(4),@year)+'-'+convert(varchar(4),@month+1)+'-01')
end
set @start=datepart(weekday,@startDay)
set @end=datepart(weekday,@endDay)
if(@start in(1,7))
begin
set @start=2
end
if(@end in(1,7))
begin
set @end=6
end
return (@end-@start+1)%5+20
end
回复
z418841875 2015-09-30
求帮助
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-09-29 09:58
社区公告
暂无公告