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

Posted

技术标签:

【中文标题】SQL - 如何使用 ISO 周获得年周?【英文标题】:SQL - How to get the Year-Week using the ISO weeks? 【发布时间】:2021-12-13 18:12:11 【问题描述】:

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

IsoWeek:

(datepart(ISOWK, [Date])) 

IsoYearNumber:

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

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

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

为了获得 YYYY-WW 格式的 ISO 年和周,我应该在上面的行中进行哪些更改? 提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

使用CONCAT 函数。 +两者 T-SQL 中的addition operator 和concatenation operator;推断是什么取决于它周围的数据。在这里,它被推断为加号运算符,而不是连接运算符,因为查询中的数据是 int 值,因此 '-' 也被隐式转换为 int'-' 作为 @ 987654329@ 是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(ISOWEEK, '20211028'), '20211028'))), '-', (DATEPART(ISOWEEK, '20211028')));

我还使您的大小写保持一致,并为日期部分使用相同的关键字ISOWEEK,因为您使用的isowwISOWK 不一致。

【讨论】:

谢谢,效果很好!!实际上 + 被用作加号运算符而不是串联运算符。

以上是关于SQL - 如何使用 ISO 周获得年周?的主要内容,如果未能解决你的问题,请参考以下文章

如何在标准 SQL 的 BigQuery 中过滤具有 iso 周值的列?

财政年度从 4 月开始,但我想使用 ISO 2018 日历年的第 14 周到 2019 日历年的第 13 周

(013)每日SQL学习:确定两个日期之间的工作日天数和计算一年周内各日期次数

如何使用 sql 查询获取包括当前周在内的最后四个星期

如何获得国家(或其ISO代码)?

如何在C中从一年和iso周中获取日期#