You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键修改说明:

  1. 统一日期判断规则:开头用SET DATEFIRST 1把周一设为一周的第一天,这样DATEPART(weekday, 日期)返回的数值中,周日固定为7,避免不同服务器默认设置(比如有的服务器把周日设为第一天,此时周日的weekday值为1)导致的判断错误。
  2. 过滤周日日期:在生成临时日期表#tempDates时,添加WHERE DATEPART(weekday, c.startdate) != 7条件,直接排除所有周日的日期。这样后续的动态列生成和透视查询都会自动忽略这些日期,报表里就不会出现周日的列了。

备选方案(依赖语言设置):

如果你的服务器语言是英文,也可以用更直观的方式过滤:

WHERE DATENAME(weekday, c.startdate) <> 'Sunday'

但注意如果是中文环境,需要改成DATENAME(weekday, c.startdate) <> '星期日',所以更推荐使用DATEPART结合DATEFIRST的方案,兼容性更强。

内容的提问来源于stack exchange,提问作者Suyash Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:13