【问题标题】:Set week number based on first Monday of Year根据一年中的第一个星期一设置周数
【发布时间】:2014-05-15 14:29:27
【问题描述】:

我有一个需求,设置一个表的周数从第一天到第一个星期一到下一个星期一等等。我可以轻松获得一年中的第一天和第一个星期一,但我不知道如何从第一个星期一开始以 7 天的间隔递增表格,以便我可以设置周数。

我有这样的事情:

UPDATE table 
SET weeknumberofyear = @WeekNumber + 1
WHERE datefield = DATEADD(Day,7,(SELECT DATEADD(DAY, (@@DATEFIRST - DATEPART(WEEKDAY, @Date)         + (8 - @@DATEFIRST) * 2) % 7, @Date)))

【问题讨论】:

  • 您能否改写您的问题以使其更清楚?看了五遍,没看懂。
  • 您想以星期二作为一周的第一天来计算周数,对吗?请参阅下面的答案。

标签: sql sql-server date while-loop sql-update


【解决方案1】:

由于datepart(week,datefield) 函数根据星期天作为一周的第一天获取星期数,您只需检查datepart(weekday,datefield),如果它是 1(星期日)或 2(星期一),则减去 1 datepart(week,datefield) 函数:

update table
    set weeknumberofyear = datepart(week,datefield) -
        case when datepart(weekday,datefield) in(1,2) then 1 else 0 end

编辑这不考虑星期日或星期一是一年中第一天的年份。在这些情况下,weeknumberofyear 将得到 0。要解决此问题,请对您的表执行第二次更新。尽管这需要两次更新,但我仍然认为它比循环浏览所有记录更有效。

update table
    set weeknumberoftheyear = weeknumberoftheyear + 1
    where year(datefield) in(
                            select distinct year(datefield)
                            from table
                            where weeknumberoftheyear = 0
                            )

编辑 WeekNumberOfTheMonth 更新 - 现在我们有了 WeekNumberOfTheYear 值,我们可以在该字段上使用排名函数来更新 WeekNumberOfTheMonth 列,而无需任何递归。

update t
  set t.weeknumberofthemonth = u.weeknumberofthemonth
  from table t
    inner join (
      select distinct weeknumberoftheyear,
         dense_rank() over(partition by month(datefield)
         order by weeknumberoftheyear) weeknumberofthemonth
      from table ) u
        on u.weeknumberofyear = t.weeknumberofyear

【讨论】:

  • 这很有效,正是我想要的。谢谢。我也必须对月份执行与周数相同的操作,但我无法将其应用于该问题。它应该是大致相同的事情吧。有什么想法吗?
  • 不客气!乐意效劳。 :) 这周有点棘手,因为想从周二开始一周,但如果你使用标准月份数字,它应该只是 set monthnumberoftheyear = month(datefiled)
  • 感谢您的帮助,但我需要以与上面的代码获取全年相同的方式获取周数。所以它应该只设置从 1 到 5 的周数,或者每个月有多少周。如果这是有道理的,我认为您更多地谈论的是设置月份值。对不起,如果我不够清楚。
【解决方案2】:

我不确定你所说的“星期一”是什么意思,但如果你想从日期中获取星期数,你可以这样做:

UPDATE table
SET weeknumberofyear = DATEPART(wk, datefield)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2016-11-29
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多