有一個鏈接這裏等較早嘗試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的代碼片段。):
查找所選日期
dateadd(week, datediff(day, 0, @date)/7, 3)
的平日4查找isoyear - 平日中的第4周總是與當週的同一年相同
datediff(yy, 0, day4)
當添加3天的isoyear的第一天isoyear的第一isoweek的隨機一天發現
dateadd(yy, datediff(yy, 0, day4),3)
找到isoyear
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
的第一isoweek的相對周尋找週一減去一週的週四第一isoweek結果isoyear
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
的第一isoweek的第一天之前4天知道的T第一個星期四他在第一個isoweek 和選定周的第一個星期四之前的一週, 使得計算一週相當容易,兩個日期的工作日都是星期四之後哪個設置日期第一次沒有關係。
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
除了星期數之外,重要的是包含ISO星期年,因爲它可以與正常日期年份不同。這似乎是不平凡的。 –
@MicheldeRuiter鏈接到iso_year [這裏](http://stackoverflow.com/questions/22829604/what-is-iso-year-in-sql-server/22830524#22830524) –
我已經找到你的答案了,很好讓其他讀者意識到。 –