| 
                
Please start any new threads on our new 
    site at https://forums.sqlteam.com.  We've got lots of great SQL Server
    experts to answer whatever question you can come up with. 
    
        | 
                
                    | 
                            
                                | Author | Topic |  
                                    | Michael Valentine JonesYak DBA Kernel (pronounced Colonel)
 
 
                                        7020 Posts | 
                                            
                                            |  Posted - 2006-01-18 : 22:08:27 
 |  
                                            | Function F_ISO_YEAR_WEEK_DAY_OF_WEEK returns the ISO 8601 Year Week Day of Week in format YYYY-W01-D for the date passed.  W01 represents the week of the year from W01 through W53, and D represents the day of the week with 1 = Monday through 7 = Sunday.The first week of each year starts on the first Monday on or before January 4 of that year, so that the year begins from December 28 of the prior year through January 4 of the current year.This code creates the function and demos it for the first day, first date+60, and first date+364 for each ISO week/year from 1990 to 2030. drop function dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEKGOcreate function dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK	(	@Date	datetime	)returns		varchar(10)as/*Function F_ISO_YEAR_WEEK_DAY_OF_WEEKreturns the ISO 8601 Year Week Day of Weekin format YYYY-W01-D for the date passed.*/begindeclare @YearWeekDayOfWeek	varchar(10)Select	--Format to form YYYY-W01-D	@YearWeekDayOfWeek =	convert(varchar(4),year(dateadd(dd,7,a.YearStart)))+'-W'+	right('00'+convert(varchar(2),(datediff(dd,a.YearStart,@Date)/7)+1),2) +	'-'+convert(varchar(1),(datediff(dd,a.YearStart,@Date)%7)+1) from(select	YearStart =	-- Case finds start of year	case	when	NextYrStart <= @date	then	NextYrStart	when	CurrYrStart <= @date	then	CurrYrStart	else	PriorYrStart	endfrom(select	-- First day of first week of prior year	PriorYrStart =	dateadd(dd,(datediff(dd,-53690,dateadd(yy,-1,aaa.Jan4))/7)*7,-53690),	-- First day of first week of current year	CurrYrStart =	dateadd(dd,(datediff(dd,-53690,aaa.Jan4)/7)*7,-53690),	-- First day of first week of next year	NextYrStart =	dateadd(dd,(datediff(dd,-53690,dateadd(yy,1,aaa.Jan4))/7)*7,-53690)from(select	--Find Jan 4 for the year of the input date	Jan4	= 	dateadd(dd,3,dateadd(yy,datediff(yy,0,@date),0))) aaa) aa) areturn @YearWeekDayOfWeekendgo-- Execute function on first day, first day+60,-- and first day+364 for years from 1990 to 2030.select	DT	= convert(varchar(10),DT,121),	YR_START_DT = 		dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK(a.DT),	YR_START_DT_60 = 		dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK(a.DT+60),	YR_START_DT_365 = 		dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK(a.DT+364)from	(	select DT = getdate()	union all	select DT = convert(datetime,'1990/01/01')  union all	select DT = convert(datetime,'1990/12/31')  union all	select DT = convert(datetime,'1991/12/30')  union all	select DT = convert(datetime,'1993/01/04')  union all	select DT = convert(datetime,'1994/01/03')  union all	select DT = convert(datetime,'1995/01/02')  union all	select DT = convert(datetime,'1996/01/01')  union all	select DT = convert(datetime,'1996/12/30')  union all	select DT = convert(datetime,'1997/12/29')  union all	select DT = convert(datetime,'1999/01/04')  union all	select DT = convert(datetime,'2000/01/03')  union all	select DT = convert(datetime,'2001/01/01')  union all	select DT = convert(datetime,'2001/12/31')  union all	select DT = convert(datetime,'2002/12/30')  union all	select DT = convert(datetime,'2003/12/29')  union all	select DT = convert(datetime,'2005/01/03')  union all	select DT = convert(datetime,'2006/01/02')  union all	select DT = convert(datetime,'2007/01/01')  union all	select DT = convert(datetime,'2007/12/31')  union all	select DT = convert(datetime,'2008/12/29')  union all	select DT = convert(datetime,'2010/01/04')  union all	select DT = convert(datetime,'2011/01/03')  union all	select DT = convert(datetime,'2012/01/02')  union all	select DT = convert(datetime,'2012/12/31')  union all	select DT = convert(datetime,'2013/12/30')  union all	select DT = convert(datetime,'2014/12/29')  union all	select DT = convert(datetime,'2016/01/04')  union all	select DT = convert(datetime,'2017/01/02')  union all	select DT = convert(datetime,'2018/01/01')  union all	select DT = convert(datetime,'2018/12/31')  union all	select DT = convert(datetime,'2019/12/30')  union all	select DT = convert(datetime,'2021/01/04')  union all	select DT = convert(datetime,'2022/01/03')  union all	select DT = convert(datetime,'2023/01/02')  union all	select DT = convert(datetime,'2024/01/01')  union all	select DT = convert(datetime,'2024/12/30')  union all	select DT = convert(datetime,'2025/12/29')  union all	select DT = convert(datetime,'2027/01/04')  union all	select DT = convert(datetime,'2028/01/03')  union all	select DT = convert(datetime,'2029/01/01')  union all	select DT = convert(datetime,'2029/12/31')  union all	select DT = convert(datetime,'2030/12/30')	) aFunction Test Results:DT         YR_START_DT YR_START_DT_60 YR_START_DT_364 ---------- ----------- -------------- --------------- 2006-01-18 2006-W03-3  2006-W11-7     2007-W03-31990-01-01 1990-W01-1  1990-W09-5     1991-W01-11990-12-31 1991-W01-1  1991-W09-5     1992-W01-11991-12-30 1992-W01-1  1992-W09-5     1992-W53-11993-01-04 1993-W01-1  1993-W09-5     1994-W01-11994-01-03 1994-W01-1  1994-W09-5     1995-W01-11995-01-02 1995-W01-1  1995-W09-5     1996-W01-11996-01-01 1996-W01-1  1996-W09-5     1997-W01-11996-12-30 1997-W01-1  1997-W09-5     1998-W01-11997-12-29 1998-W01-1  1998-W09-5     1998-W53-11999-01-04 1999-W01-1  1999-W09-5     2000-W01-12000-01-03 2000-W01-1  2000-W09-5     2001-W01-12001-01-01 2001-W01-1  2001-W09-5     2002-W01-12001-12-31 2002-W01-1  2002-W09-5     2003-W01-12002-12-30 2003-W01-1  2003-W09-5     2004-W01-12003-12-29 2004-W01-1  2004-W09-5     2004-W53-12005-01-03 2005-W01-1  2005-W09-5     2006-W01-12006-01-02 2006-W01-1  2006-W09-5     2007-W01-12007-01-01 2007-W01-1  2007-W09-5     2008-W01-12007-12-31 2008-W01-1  2008-W09-5     2009-W01-12008-12-29 2009-W01-1  2009-W09-5     2009-W53-12010-01-04 2010-W01-1  2010-W09-5     2011-W01-12011-01-03 2011-W01-1  2011-W09-5     2012-W01-12012-01-02 2012-W01-1  2012-W09-5     2013-W01-12012-12-31 2013-W01-1  2013-W09-5     2014-W01-12013-12-30 2014-W01-1  2014-W09-5     2015-W01-12014-12-29 2015-W01-1  2015-W09-5     2015-W53-12016-01-04 2016-W01-1  2016-W09-5     2017-W01-12017-01-02 2017-W01-1  2017-W09-5     2018-W01-12018-01-01 2018-W01-1  2018-W09-5     2019-W01-12018-12-31 2019-W01-1  2019-W09-5     2020-W01-12019-12-30 2020-W01-1  2020-W09-5     2020-W53-12021-01-04 2021-W01-1  2021-W09-5     2022-W01-12022-01-03 2022-W01-1  2022-W09-5     2023-W01-12023-01-02 2023-W01-1  2023-W09-5     2024-W01-12024-01-01 2024-W01-1  2024-W09-5     2025-W01-12024-12-30 2025-W01-1  2025-W09-5     2026-W01-12025-12-29 2026-W01-1  2026-W09-5     2026-W53-12027-01-04 2027-W01-1  2027-W09-5     2028-W01-12028-01-03 2028-W01-1  2028-W09-5     2029-W01-12029-01-01 2029-W01-1  2029-W09-5     2030-W01-12029-12-31 2030-W01-1  2030-W09-5     2031-W01-12030-12-30 2031-W01-1  2031-W09-5     2032-W01-1(43 row(s) affected)CODO ERGO SUM |  |  
                                    | evbstvStarting Member
 
 
                                    2 Posts | 
                                        
                                          |  Posted - 2008-03-19 : 15:57:56 
 |  
                                          | Great!  I searched other places for this but this is the best one of all.  Thanks. |  
                                          |  |  |  
                                    | LxocramStarting Member
 
 
                                    1 Post | 
                                        
                                          |  Posted - 2012-02-03 : 07:53:31 
 |  
                                          | The test-code is not language setting proof, add conversion hint ,121Msg 242, Level 16, State 3, Line 6The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.-- Execute function on first day, first day+60,-- and first day+364 for years from 1990 to 2030.select	DT	= convert(varchar(10),DT,121),	YR_START_DT = 		dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK(a.DT),	YR_START_DT_60 = 		dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK(a.DT+60),	YR_START_DT_365 = 		dbo.F_ISO_YEAR_WEEK_DAY_OF_WEEK(a.DT+364)from	(	select DT = getdate()	union all	select DT = convert(datetime,'1990/01/01',121)  union all	select DT = convert(datetime,'1990/12/31',121)  union all	select DT = convert(datetime,'1991/12/30',121)  union all	select DT = convert(datetime,'1993/01/04',121)  union all	select DT = convert(datetime,'1994/01/03',121)  union all	select DT = convert(datetime,'1995/01/02',121)  union all	select DT = convert(datetime,'1996/01/01',121)  union all	select DT = convert(datetime,'1996/12/30',121)  union all	select DT = convert(datetime,'1997/12/29',121)  union all	select DT = convert(datetime,'1999/01/04',121)  union all	select DT = convert(datetime,'2000/01/03',121)  union all	select DT = convert(datetime,'2001/01/01',121)  union all	select DT = convert(datetime,'2001/12/31',121)  union all	select DT = convert(datetime,'2002/12/30',121)  union all	select DT = convert(datetime,'2003/12/29',121)  union all	select DT = convert(datetime,'2005/01/03',121)  union all	select DT = convert(datetime,'2006/01/02',121)  union all	select DT = convert(datetime,'2007/01/01',121)  union all	select DT = convert(datetime,'2007/12/31',121)  union all	select DT = convert(datetime,'2008/12/29',121)  union all	select DT = convert(datetime,'2010/01/04',121)  union all	select DT = convert(datetime,'2011/01/03',121)  union all	select DT = convert(datetime,'2012/01/02',121)  union all	select DT = convert(datetime,'2012/12/31',121)  union all	select DT = convert(datetime,'2013/12/30',121)  union all	select DT = convert(datetime,'2014/12/29',121)  union all	select DT = convert(datetime,'2016/01/04',121)  union all	select DT = convert(datetime,'2017/01/02',121)  union all	select DT = convert(datetime,'2018/01/01',121)  union all	select DT = convert(datetime,'2018/12/31',121)  union all	select DT = convert(datetime,'2019/12/30',121)  union all	select DT = convert(datetime,'2021/01/04',121)  union all	select DT = convert(datetime,'2022/01/03',121)  union all	select DT = convert(datetime,'2023/01/02',121)  union all	select DT = convert(datetime,'2024/01/01',121)  union all	select DT = convert(datetime,'2024/12/30',121)  union all	select DT = convert(datetime,'2025/12/29',121)  union all	select DT = convert(datetime,'2027/01/04',121)  union all	select DT = convert(datetime,'2028/01/03',121)  union all	select DT = convert(datetime,'2029/01/01',121)  union all	select DT = convert(datetime,'2029/12/31',121)  union all	select DT = convert(datetime,'2030/12/30',121)) a |  
                                          |  |  |  
                                |  |  |  |  |  |