Ada tautan di sini untuk upaya sebelumnya lainnya http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510
Ini adalah kode LAMA untuk fungsi
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
Setelah menggabungkan jawaban brilian @AndriyM dengan jawaban saya sendiri, kami turun ke 1 baris. Ini adalah kode BARU.
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
Penjelasan untuk kode lama (tidak akan menjelaskan kode baru. Ini adalah fragmen dari kode saya dan kode AndriyM):
Menemukan hari kerja 4 dari tanggal yang dipilih
dateadd(week, datediff(day, 0, @date)/7, 3)
Menemukan isoyear - tahun hari kerja 4 minggu selalu tahun yang sama dengan isoyear minggu itu
datediff(yy, 0, day4)
Saat menambahkan 3 hari ke hari pertama isoyear, hari acak dari isoweek pertama isoyear ditemukan
dateadd(yy, datediff(yy, 0, day4),3)
menemukan minggu relatif dari isoweek pertama isoyear
datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7
Menemukan hari Senin dikurangi 4 hari dari isoweek pertama menghasilkan kamis dalam seminggu SEBELUM hari pertama isoweek pertama isoyear
dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)
Mengetahui kamis pertama dalam seminggu sebelum isoweek pertama dan kamis pertama dari minggu yang dipilih, membuatnya cukup mudah untuk menghitung minggu, tidak peduli tanggal pengaturan mana yang pertama karena hari kerja dari kedua tanggal adalah kamis.
datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)