SQL - 如何使用 ISO 周获取年周?

问题描述 投票:0回答:1

我想使用 ISO 周数获取年份数 - 周数(例如 2021-01)。 我确实设法使用以下代码将它们分开:

IsoWeek:

(datepart(ISOWK, [Date])) 

ISO年份编号:

YEAR(DATEADD(day, 26 - DATEPART(isoww, [Date]), [Date]))

但是,当我尝试使用下面的行将它们组合成 YYYY-WW 格式时,我会得到奇怪的值,例如 2073 for 2020 WK 53。

(YEAR(DATEADD(day, 26 - DATEPART(isoww, [Date]), [Date]))) + '-' + (datepart(ISOWK, [Date])) 

我应该在上面的行中更改什么才能获得 YYYY-WW 格式的 ISO 年和周? 感谢您提前的帮助!

sql-server date tsql calendar
1个回答
3
投票

使用

CONCAT
功能。
+
是 T-SQL 中的加法运算符串联运算符;它的推断取决于它周围的数据。这里它被推断为加号运算符,而不是串联运算符,因为查询中的数据是 int 值,因此
'-'
也被隐式转换为
int
'-'
作为
int
0
)。
如果我们使用当前日期,我们有以下表达式:

(YEAR(DATEADD(day, 26 - DATEPART(isoww, '20211028'), '20211028'))) + '-' + (datepart(ISOWK, '20211028'))

这将返回 
2064

。那是因为它解析为

2021 + '-' + 43 = 2021 + 0 + 43 = 2064
如果你使用 

CONCAT

你会得到你想要的,它首先将每个值隐式转换为基于字符串的数据类型:

SELECT CONCAT((YEAR(DATEADD(day, 26 - DATEPART(ISO_WEEK, '20211028'), '20211028'))), '-', (DATEPART(ISO_WEEK, '20211028')));

我还使您的大小写保持一致,并在日期部分使用相同的关键字,

ISOWEEK,因为您不一致地使用

isoww
ISOWK

    

© www.soinside.com 2019 - 2024. All rights reserved.