如何在SQL生成学生考勤报表时排除周日?附现有实现代码
解决方案:生成考勤报表时跳过周日
要让考勤报表自动跳过周日,只需要在生成日期列表的环节把周日过滤掉就行。这里有个兼容性强的修改方案,能避免因服务器日期设置差异导致的判断错误,具体修改后的代码如下:
SET DATEFIRST 1; -- 统一设置周一为一周的第一天,确保周日的weekday值固定为7 DECLARE @startdate date = '20180109'; DECLARE @enddate date = '20180112'; DECLARE @cols as varchar(2000); DECLARE @query as varchar(MAX); WITH cte (startdate) AS ( SELECT @startdate AS startdate UNION ALL SELECT DATEADD(DAY, 1, startdate) AS startdate FROM cte WHERE startdate < @enddate ) -- 过滤掉周日的日期后插入临时表 select c.startdate into #tempDates from cte c WHERE DATEPART(weekday, c.startdate) != 7; -- 排除周日 SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(CHAR(10), startdate, 120)) FROM #tempDates FOR XML PATH (''), TYPE) .value('.', 'NVARCHAR(MAX)') , 1, 1, '') SET @query = 'SELECT RollNo,FirstName,LastName, ' + @cols + ' from ( select S.RollNo,U.FirstName,U.LastName, D.startdate, convert(CHAR(10), startdate, 120) PivotDate from #tempDates D,Attendance A, Student S, UserDetails U where D.startdate = A.Date and A.EnrollmentNo=S.EnrollmentNo and A.EnrollmentNo=U.userID ) x pivot ( count(startdate) for PivotDate in (' + @cols + ') ) p ' EXECUTE (@query) drop table #tempDates
关键修改说明:
- 统一日期判断规则:开头用
SET DATEFIRST 1把周一设为一周的第一天,这样DATEPART(weekday, 日期)返回的数值中,周日固定为7,避免不同服务器默认设置(比如有的服务器把周日设为第一天,此时周日的weekday值为1)导致的判断错误。 - 过滤周日日期:在生成临时日期表
#tempDates时,添加WHERE DATEPART(weekday, c.startdate) != 7条件,直接排除所有周日的日期。这样后续的动态列生成和透视查询都会自动忽略这些日期,报表里就不会出现周日的列了。
备选方案(依赖语言设置):
如果你的服务器语言是英文,也可以用更直观的方式过滤:
WHERE DATENAME(weekday, c.startdate) <> 'Sunday'
但注意如果是中文环境,需要改成DATENAME(weekday, c.startdate) <> '星期日',所以更推荐使用DATEPART结合DATEFIRST的方案,兼容性更强。
内容的提问来源于stack exchange,提问作者Suyash Gupta
相关产品推荐
相关产品推荐

