标签:
今天有个需求是这样的,要查出本月的工作日之和,在网上搜索了一下,发现看起来最简单的是这样的:
1 DECLARE @DAY DATE,@COUNT INT 2 SET @DAY=CONVERT(VARCHAR(10),Dateadd(dd, -Datepart(dd,GetDate())+ 1,GetDate()), 23) 3 SET @COUNT=0 4 WHILE @DAY<=CONVERT(VARCHAR(100), GetDate(),23) 5 BEGIN 6 SET @COUNT=@COUNT+( 7 CASE DATEPART(WEEKDAY,@DAY) WHEN 1 THEN 0 8 WHEN 7 THEN 0 9 ELSE 1 10 END ) 11 SET @DAY=DATEADD(DAY,1,@DAY) 12 END 13 SELECT @COUNT
简单看了看,觉得有些地方可以优化下,之前有过查询两个时间段内所有日期的列表的经验,所以做了一些改动,现一句话就可以查出:
1 select sum( 2 CASE when DATEPART(WEEKDAY,DATEADD(dd,number,‘2016.10.01‘ )) in (1,7) THEN 0 ELSE 1 END) as WorkDay 3 from master..spt_values 4 where type=‘P‘ and dateadd(dd,number,‘2016.10.01‘)<=‘2016.10.18‘
这里是只查询非周六周日的,如果想要节假日等,可以自己修改下,达到一样的效果。
PS:查询两个时间段内所有日期的列表
1 select DATEADD(dd,number,‘2016.10.01‘ ) 2 from master..spt_values 3 where type=‘P‘ and dateadd(dd,number,‘2016.10.01‘)<=‘2016.10.18‘
这里用了一个小技巧,利用系统表 master..spt_values 里自带的增长集合,来做 DATEADD 的运算。
个人经验,分享下,第一次写博客,欢迎交流~
标签:
原文地址:http://www.cnblogs.com/Mojoo/p/5973528.html