Declare @i Int = 0 ;
While @i < 7
Begin
Set @i += 1 ;
Set DateFirst @i ;
Declare @dt DateTime = '2019-01-01 00:00:00' ;
Select --用来确定一周中第一天是星期几 所有的日期函数中,只有 DATEPART 函数受 DATEFIRST 的影响,其它函数都不受其影响。
@@DateFirst As [@@DateFirst] ,
--DATEPART(WEEKDAY, @DT) 返回指定日期是一周中的第几天,注意是相对于 DATEFIRST 为一周中第一天,这和是星期几不是一个概念。
--这也就是说,随着 DATEFIRST 设置不同,同一日期的上述返回值也不同。
DatePart( Weekday, @dt ) As 以当前设置 ,
--为了抵消这种影响,我们可以将 @@DATEFIRST 添加到 @DT 上,此时调用 DATEPART 与把 DATEFIRST 设为 7 的结果是一致的。
--DatePart( Weekday, @dt+@@DateFirst ) 以周日开始,
--如果你想把 DATEFIRST 逻辑 地设置为 n ,从日期减去常数 n 即可:
DatePart( Weekday, @dt + @@DateFirst - 1 ) As 以周一开始 ,
DatePart( Weekday, @dt + @@DateFirst - 2 ) As 以周二开始 ,
DatePart( Weekday, @dt + @@DateFirst - 3 ) As 以周三开始 ,
DatePart( Weekday, @dt + @@DateFirst - 4 ) As 以周四开始 ,
DatePart( Weekday, @dt + @@DateFirst - 5 ) As 以周五开始 ,
DatePart( Weekday, @dt + @@DateFirst - 6 ) As 以周六开始 ,
DatePart( Weekday, @dt + @@DateFirst - 7 ) As 以周日开始 ,
--以星期天开始 ,获取指定日期所在周的第一天
DatePart( Weekday, @dt + @@DateFirst - 7 ) - 1 As 需要往前几天 , --当前是本周第3天.只能往前退2天.退3天就是再上一周了
DateAdd( Day, 1 - DatePart( Weekday, @dt + @@DateFirst - 7 ), @dt ) 所在周的第一天,
--以星期天开始 ,获取指定日期所在周的最后一天
7 - DatePart( Weekday, @dt + @@DateFirst - 7 ) As 需要往后几天 , --当前是本周第3天.往后7-3=4天
DateAdd( Day, 7 - DatePart( Weekday, @dt + @@DateFirst - 7 ), @dt ) 所在周的最后一天;
End ;
原文
https://blog.csdn.net/iteye_2060/article/details/81799973#commentBox