如何在 SQL Server 2012 中对月份列的 varchar 星期进行排序?
How to sort varchar week of the month column in SQL Server 2012?
我有日历 table,其中最后一列是 varchar
“WeekOfMonth
”。创建列 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'.
所做的操作
算术上(因为YEAR
和DATEPART(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'
我有日历 table,其中最后一列是 varchar
“WeekOfMonth
”。创建列 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'.
所做的操作算术上(因为YEAR
和DATEPART(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'