如何在 SQL Server 2012 中对月份列的 varchar 星期进行排序?

How to sort varchar week of the month column in SQL Server 2012?

我有日历 table,其中最后一列是 varcharWeekOfMonth”。创建列 WeekOfMonthSort 的最有效方法是什么?

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

我尝试合并年份和周数,但是当新年开始时,前一年的排序值变得小于明年。

我会尝试回答这个问题....

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 Sort'.

所做的操作

算术上(因为YEARDATEPART(wk函数的输出是数字)你需要做的是:

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

第 10 周的结果为 2019 * 100 + 10 = 201900 + 10 = 201910,第 11 周的结果为 201911。

您也可以使用字符串连接获得相同的结果:

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