SQL 中有个datepart函数,datepart(weekday,getdate()) 可以返回现在是星期几,但它受set datefirst 选项的影响,实际是不准确的。
select @@datefirst 可以获取当前 set datefirst 的设置值,也就是每周的第一天是星期几。我的SQL Server里返回的是7,这是默认设置。也就是SQL Server把星期日当作每周的第一天。
如果今天是星期5,那么datepart(weekday,getdate()) 将返回6。
要解决以上问题,请使用以下公式,计算给定的日期实际是星期几。星期日用0表示。
(datepart(weekday,getdate())+@@datefirst-1)%7
附两个存储过程,返回给定日期到月末有几个星期6。
create proc getSaturdayCount(
@dt datetime
)as
begin
declare @lastdateOfMonth datetime
--找出本月的最后一天
set @lastdateOfMonth=dateadd(day,-1,convert(char(8),dateadd(month,1,@dt),120)+'1')
--先计算出最近的周六到月末的天数,再除以7加上1,得有几个星期六
return (datediff(dd,@dt,@lastdateOfMonth)-(6-(datepart(weekday,@dt)+@@datefirst-1)%7))/7+1
end

--test
declare @r int
exec @r=getSaturdayCount '2007-7-1'
print @r
create proc getSaturdayCount(
@dt datetime
)as
begin
declare @lastdateOfMonth datetime
declare @t table(dt datetime)
--找出本月的最后一天
set @lastdateOfMonth=dateadd(day,-1,convert(char(8),dateadd(month,1,@dt),120)+'1')
--找出下一个星期6
set @dt=dateadd(dd,(6-(datepart(weekday,@dt)+@@datefirst-1)%7),@dt)
while @dt<@lastdateOfMonth
begin
insert @t values(@dt)
set @dt=dateadd(dd,7,@dt)
end
select * from @t
end

--test
exec getSaturdayCount '2007-7-1'