Как отсортировать столбец недели месяца в SQL Server 2012? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть таблица календаря, где последний столбец varchar "WeekOfMonth". Какой самый эффективный способ создать колонку WeekOfMonthSort?

enter image description here

DECLARE @MinDate DATE = CAST(DATEADD(yy, -2, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)) AS DATE),
        @MaxDate DATE = CAST(GETDATE() + 90 as DATE);

;WITH cte_Calendar AS 
(
    SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
    FROM    
        sys.all_objects a
    CROSS JOIN 
        sys.all_objects b
) 
SELECT 
    Date,
    MONTH(Date) AS MonthNum,
    YEAR(Date) AS YearNum,
    FORMAT(Date, 'MMM') AS Month,
    FORMAT(Date, 'MMM') + '-'+ FORMAT(Date, 'yy') AS  'MM-YY',
    YEAR(Date) * 12 + MONTH(Date) -1 AS 'MM-YY Sort',
    --'Week-' + CONVERT(VARCHAR(3), DATEPART(wk, Date)) AS Week,
    YEAR(Date) + DATEPART(wk, Date) AS 'Week Sort',
    WeekOfMonth = 'Week-' + CONVERT(VARCHAR(1), CONVERT(TINYINT, DENSE_RANK() OVER (PARTITION BY YEAR(Date), MONTH(Date) ORDER BY DATEPART(wk, Date))))
FROM
    cte_Calendar

enter image description here

Я пытался объединить год и номер недели, но когда начинается новый год, значение сортировки за предыдущий год становится меньше, чем в следующем.

enter image description here

1 Ответ

1 голос
/ 10 июля 2019

Я попытаюсь ответить на это ....

YEAR(Date) + DATEPART(wk, Date) AS 'Week Sort',

Вышеприведенное утверждение не имеет смысла.Я подозреваю, что вы путаете конкатенацию строк с добавлением чисел, то есть YEAR(Date) + DATEPART(wk, Date) дает вам 2019 + 10 = 2029, что не то, что вы ожидаете, но затем я также замечаю, что

YEAR(Date) * 12 + MONTH(Date) -1 AS 'MM-YY Sort'

закодировано правильно.

Чтобы объединить числа года и месяца вместе, вам нужно сделать эквивалент строки, добавляемой или другими словами, аналогично тому, что сделано для 'MM-YY Сортировка'.

Арифметически (потому что вывод YEAR и DATEPART(wk функции числовые) вам нужно сделать следующее:

YEAR(Date) * 100 + DATEPART(wk, Date) AS 'Week Sort'

Результат для 10-й недели будет 2019 * 100 + 10 = 201900 + 10 = 201910 и 201911 для 11-й недели.

Вы также можете достичь того же результата, используя конкатенацию строк:

CAST( YEAR(Date) AS VARCHAR ) + RIGHT( '0' + CAST( DATEPART(wk, DATE ) AS VARCHAR ), 2 ) AS 'Week Sort'
...