To get the correct week number based on ISO standard you can use this function:
--Credit to Ramakrishna Elashwarapu
CREATE FUNCTION dbo.tvfGetWeekNumberFromDate_ISO
(
@dDate DATETIME
)
RETURNS @WeekNumber TABLE
(
[Year] INT NULL
,[WeekNumber] INT NULL
)
WITH SCHEMABINDING
AS
BEGIN
DECLARE
@iWeekdayNumber INT
,@dCurrThurs DATETIME
,@YearFirstThurs DATETIME
,@iYearFirstThursWeekNum INT
,@dFirstThursYear DATETIME
,@iWeekNumber INT
SET @iWeekdayNumber = (((DATEPART(dw, @dDate) - 1) + (@@DATEFIRST - 1)) % 7) + 1
SET @dCurrThurs = DATEADD(d,(4 - @iWeekdayNumber),@dDate)
SET @YearFirstThurs = CAST(CAST(YEAR(@dCurrThurs) AS CHAR(4)) + '-01-01' AS DATETIME)
SET @iYearFirstThursWeekNum = (((DATEPART(dw, @YearFirstThurs) - 1) + (@@DATEFIRST - 1)) % 7) + 1
IF (@iYearFirstThursWeekNum in (1,2,3,4))
SET @dFirstThursYear = DATEADD(d,(4 - @iYearFirstThursWeekNum),@YearFirstThurs)
ELSE
SET @dFirstThursYear = DATEADD(d,(4 - @iYearFirstThursWeekNum + 7),@YearFirstThurs)
SET @i[WeekNumber] = DATEDIFF(d,@dFirstThursYear,@dCurrThurs)/7+1
INSERT INTO @WeekNumber
SELECT YEAR(@dFirstThursYear),@iWeekNumber
RETURN
END
Then just do a CROSS APPLY and ROW_NUMBER() to sort:
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable
CREATE TABLE #TempTable (
[ID] INT IDENTITY(1,1) NOT NULL,
[mydate] DATETIME NULL,
PRIMARY KEY (ID))
INSERT INTO #TempTable
SELECT '20121222 00:00:00.000' UNION ALL
SELECT '20121223 00:00:00.000' UNION ALL
SELECT '20121224 00:00:00.000' UNION ALL
SELECT '20121225 00:00:00.000' UNION ALL
SELECT '20121226 00:00:00.000' UNION ALL
SELECT '20121227 00:00:00.000' UNION ALL
SELECT '20121228 00:00:00.000' UNION ALL
SELECT '20121229 00:00:00.000' UNION ALL
SELECT '20121230 00:00:00.000' UNION ALL
SELECT '20121231 00:00:00.000' UNION ALL
SELECT '20130101 00:00:00.000' UNION ALL
SELECT '20130102 00:00:00.000' UNION ALL
SELECT '20130103 00:00:00.000' UNION ALL
SELECT '20130104 00:00:00.000' UNION ALL
SELECT '20130105 00:00:00.000' UNION ALL
SELECT '20130106 00:00:00.000' UNION ALL
SELECT '20130107 00:00:00.000' UNION ALL
SELECT '20130108 00:00:00.000' UNION ALL
SELECT '20130109 00:00:00.000'
SELECT
ROW_NUMBER() OVER (ORDER BY w.[Year],w.[WeekNumber]) AS RowNum
,CAST(w.[Year] AS CHAR(4))
+ (CASE
WHEN LEN(w.[WeekNumber]) = 1 THEN '0'+CAST(w.[WeekNumber] AS CHAR(1))
ELSE CAST(w.[WeekNumber] AS CHAR(2))
END)
AS YearWeek
,mydate AS OriginalDate
FROM
#TempTable AS tt
CROSS APPLY
dbo.tvfGetWeekNumberFromDate_ISO(tt.mydate) AS w
WHERE
tt.ID > 0
Output:
RowNumYearWeekOriginalDate
12012512012-12-22 00:00:00.000
22012512012-12-23 00:00:00.000
32012522012-12-24 00:00:00.000
42012522012-12-25 00:00:00.000
52012522012-12-26 00:00:00.000
62012522012-12-27 00:00:00.000
72012522012-12-28 00:00:00.000
82012522012-12-29 00:00:00.000
92012522012-12-30 00:00:00.000
102013012012-12-31 00:00:00.000
112013012013-01-01 00:00:00.000
122013012013-01-02 00:00:00.000
132013012013-01-03 00:00:00.000
142013012013-01-04 00:00:00.000
152013012013-01-05 00:00:00.000
162013012013-01-06 00:00:00.000
172013022013-01-07 00:00:00.000
182013022013-01-08 00:00:00.000
192013022013-01-09 00:00:00.000