【问题标题】:TSQL ISO Month Week Number for ISO Year Week NumberISO 年周数的 TSQL ISO 月周数
【发布时间】:2016-10-03 20:03:48
【问题描述】:

使用 TSQL,我需要获取一个月中的 ISO 周数以获取给定的 ISO 年周数。

例如:以下代码将为我提供 2001 年 12 月 31 日的第 1 周,这是正确的。这是 2002 年的第一个星期一,也是 ISO 2002 年的第一天。

select DATEPART(ISO_WEEK, '12-31-2001'); --Week 1 January 2002

我的问题是我该如何...

(1) 以 ISO 周数为例:ISO 年周数:2016 年 4 月 4 日(4 月第 1 周)为 14。

(2) 现在取 ISO Year Week Number 14 并返回 April Month Week Number = 1 对于上面的示例。

SQL Server 中似乎没有任何东西可以从 ISO 年周号中获取 ISO 月周号。我有一个我写的函数,但它有一些技巧可以让它工作,但不是 100%。

【问题讨论】:

  • 您是否在询问如何在给定 ISO_WEEK 编号的情况下获取月份(第 1 周为 1 月,第 52 周为 12 月)?
  • 嗨,贝丝,我在问如何在一个月内参加一周@。假设 2016 年 ISO 第 14 周 = 2016 年 4 月 4 日(4 月周数 = 1)。我在上面更新了我的问题。谢谢

标签: tsql


【解决方案1】:

我想你想要这样的东西......但我不确定你为什么需要 ISO_WEEK。只需将 getdate() 替换为您的列即可。

select datepart(wk, getdate()) - datepart(wk,dateadd(m, DATEDIFF(M, 0, getdate()), 0)) + 1

【讨论】:

  • 感谢您的回复,我需要 ISO 月周,因为我使用的是 ISO 年。您的代码将返回月周数,但由于 ISO 年可以有 53 周,如果您尝试运行它在 2001 年 12 月 31 日,您将获得 12 月第 6 周,但对于 ISO,该月属于 2002 年,因为 1 月第 1 周选择 datepart(wk, '12-31-2001') - datepart(wk,dateadd(m, DATEDIFF( M, 0, '12-31-2001'), 0)) + 1. 见这个 ISO 日历。 epochconverter.com/weeks/2002
  • 啊,我看到了@RegencySoftware
【解决方案2】:

在尝试在函数中处理获取 ISO 月周数后,我决定一个更简单的解决方案是在 SQL Sever 中创建一个 ISO_Calendar 表。

我们知道,在 TSQL 中,您可以获得 ISO 年周数和一些 ISO 年数。 ISO 月周数是另一回事。

我通过填充除 ISO 月份编号以外的所有列,使用 2000 年到 2040 年的数据构建了下表所示的表格。然后在第二次遍历表中,根据星期一日期中的月号设置 ISO 月号。

现在,如果我想获取某个日期的 ISO 月份编号,我会检查周一和周日之间的 @Date。就我而言,我只关心星期一和星期五之间的日期,因为这是一个股票分析网站。

select @ISOMonthWeekNo = c.ISOMonthWeekNo
from ISO_Calendar c
where @TransDate between c.Monday and c.Sunday;

优点是表格是一次性构建的,更容易验证数据的准确性。

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 2018-03-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2021-12-13
    • 2016-05-02
    • 2023-03-06
    • 2021-07-22
    相关资源
    最近更新 更多