SQL统计查询时间段内工作日之和

今天有个需求是这样的,要查出本月的工作日之和,在网上搜索了一下,发现看起来最简单的是这样的:

 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 的运算。

 

个人经验,分享下,第一次写博客,欢迎交流~

posted @ 2016-10-18 15:34  TheJimmy  阅读(1910)  评论(1编辑  收藏  举报