Có một liên kết ở đây cho những lần thử khác trước đó http://www.sqlteam. com / forum / topic.asp? TOPIC_ID =60510
Đây là mã CŨ cho hàm
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
Sau khi kết hợp câu trả lời tuyệt vời của @AndriyM với câu trả lời của riêng tôi, chúng tôi rút ra được 1 dòng. Đây là mã MỚI.
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
Giải thích cho mã cũ (sẽ không giải thích mã mới. Đó là các đoạn từ mã của tôi và mã của AndriyM):
Tìm ngày thứ 4 trong tuần của ngày đã chọn
dateadd(week, datediff(day, 0, @date)/7, 3)
Tìm kiếm năm - năm của ngày trong tuần 4 của một tuần luôn trùng với năm của năm đó
datediff(yy, 0, day4)
Khi thêm 3 ngày vào ngày đầu tiên của năm, một ngày ngẫu nhiên của ngày đầu tiên của năm đó sẽ được tìm thấy
dateadd(yy, datediff(yy, 0, day4),3)
tìm tuần tương đối của isoweek đầu tiên của isoyear
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Tìm ngày thứ hai trừ đi 4 ngày của giờ thứ nhất sẽ cho kết quả là ngày thứ năm trong tuần TRƯỚC ngày đầu tiên của giờ thứ nhất của năm thứ nhất
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Việc biết ngày thứ năm đầu tiên của tuần trước ngày thứ nhất đầu tiên và ngày thứ năm đầu tiên của tuần đã chọn, giúp việc tính toán trong tuần trở nên khá dễ dàng, không quan trọng việc thiết lập ngày đầu tiên vì các ngày trong tuần của cả hai ngày đều là thứ năm.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)