这里有一个链接用于其他早期的尝试http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=60510 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=60510
这是该函数的旧代码
CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
DECLARE @rv int
SELECT @rv = datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
FROM (SELECT dateadd(ww, datediff(day, 0, @date)/7, 3) day4) a
RETURN @rv
END
将 @AndriyM 的精彩答案与我自己的答案结合起来后,我们只剩下 1 行。这是新代码。
CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
-- replaced code for yet another improvement.
--RETURN (datepart(DY, dateadd(ww, datediff(d, 0, @date) / 7, 3))+6) / 7
END
旧代码的解释(不解释新代码。它是我的代码和AndriyM的代码的片段):
查找所选日期的第 4 个工作日
dateadd(week, datediff(day, 0, @date)/7, 3)
查找 isoyear - 一周的第 4 天的年份始终与该周的 isoyear 相同
datediff(yy, 0, day4)
当向等年的第一天添加 3 天时,会找到等年的第一个等周的随机日期
dateadd(yy, datediff(yy, 0, day4),3)
查找等值年的第一个等值周的相对周
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
查找第一个等周的星期一减去 4 天,结果是等年的第一个等周的第一天之前的星期四
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
知道第一个等周之前一周的第一个星期四
以及所选周的第一个星期四,
使得计算周变得非常容易,无论 datefirst 的设置如何,因为两个日期的工作日都是星期四。
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)