【问题标题】:Fill the month for IsoWeek填写 IsoWeek 的月份
【发布时间】:2020-11-07 17:56:41
【问题描述】:

首先,很抱歉这篇长专栏,我不得不把它全部发布出来,这样你就可以更好地理解我在努力解决什么问题。

我有一个带有 TheDate 和 ISOWeek 的日历。

我要做的是创建另一个代表该日期月份的列。编号将从 1 开始,包含完整的 IsoWeek 和完整的月份。

例如,1 月将在 2 月 2 日结束,因为从 2 月开始,1 月的最后一个完整周“位”。 我尝试了很多解决方案,例如将 ISOWeek 转换为 ISOMonth,但都没有给出预期的结果。

感谢任何帮助。

编辑: 感谢 Alex 下面的解决方案是:

SELECT month(dateadd(d, 3, dateadd(WEEK, datediff(WEEK, 0, DATEADD(d,-1,'20200302')), 0)))
TheDate   IsoWeek  The Month---I want to add this 
12/30/2019  1       1
12/31/2019  1       1
1/1/2020    1       1
1/2/2020    1       1
1/3/2020    1       1
1/4/2020    1       1
1/5/2020    1       1
1/6/2020    2       1
1/7/2020    2       1
1/8/2020    2       1
1/9/2020    2       1
1/10/2020   2       1
1/11/2020   2       1
1/12/2020   2       1
1/13/2020   3       1
1/14/2020   3       1
1/15/2020   3       1
1/16/2020   3       1
1/17/2020   3       1
1/18/2020   3       1
1/19/2020   3       1
1/20/2020   4       1
1/21/2020   4       1
1/22/2020   4       1
1/23/2020   4       1
1/24/2020   4       1
1/25/2020   4       1
1/26/2020   4       1
1/27/2020   5       1
1/28/2020   5       1
1/29/2020   5       1
1/30/2020   5       1
1/31/2020   5       1
2/1/2020    5       1
2/2/2020    5       1
2/3/2020    6       2
2/4/2020    6       2
2/5/2020    6       2
2/6/2020    6       2
2/7/2020    6       2
2/8/2020    6       2
2/9/2020    6       2
2/10/2020   7       2
2/11/2020   7       2
2/12/2020   7       2
2/13/2020   7       2
2/14/2020   7       2
2/15/2020   7       2
2/16/2020   7       2
2/17/2020   8       2
2/18/2020   8       2
2/19/2020   8       2
2/20/2020   8       2
2/21/2020   8       2
2/22/2020   8       2
2/23/2020   8       2
2/24/2020   9       2
2/25/2020   9       2
2/26/2020   9       2
2/27/2020   9       2
2/28/2020   9       2
2/29/2020   9       2
3/1/2020    9       2
3/2/2020    10      3
3/3/2020    10      3
3/4/2020    10      3
3/5/2020    10      3
3/6/2020    10      3
3/7/2020    10      3
3/8/2020    10      3
3/9/2020    11      3
3/10/2020   11      3
3/11/2020   11      3
3/12/2020   11      3
3/13/2020   11      3
3/14/2020   11      3
3/15/2020   11      3
3/16/2020   12      3
3/17/2020   12      3
3/18/2020   12      3
3/19/2020   12      3
3/20/2020   12      3
3/21/2020   12      3
3/22/2020   12      3
3/23/2020   13      3
3/24/2020   13      3
3/25/2020   13      3
3/26/2020   13      3
3/27/2020   13      3
3/28/2020   13      3
3/29/2020   13      3
3/30/2020   14      3
3/31/2020   14      3
4/1/2020    14      3
4/2/2020    14      3
4/3/2020    14      3
4/4/2020    14      3
4/5/2020    14      3

【问题讨论】:

    标签: sql sql-server time isodate


    【解决方案1】:

    ISO 周从星期一开始,因此给定周的月/年始终等于该周星期四的月/年。 您可以通过截断日期列的周数来获得此信息,然后添加 3 天,如下所示:

    ALTER TABLE calendar ADD TheMonth int;
    UPDATE calendar SET TheMonth = month(dateadd(DAY, 3, dateadd(WEEK, datediff(WEEK, 0, TheDate), 0)))
    

    编辑:我已经减少了一天的工作时间

    SELECT month(dateadd(d, 3, dateadd(WEEK, datediff(WEEK, 0, dateadd(d,-1,TheDate)), 0)))
    

    【讨论】:

    • 嘿,这几乎是完美的。但是如果我运行 SELECT month(dateadd(d, 3, dateadd(WEEK, datediff(WEEK, 0, '20200202'), 0))) 我得到 2 而不是 1。我认为这与一周的开始有关日。我设置了 DATEFIRST 1 但我得到了相同的结果:(
    • 感谢 Alex,这是创建日历时的宝贵信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多