根据年度的第一个星期一设置周数

时间:2014-04-03 16:04:22

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

我需要设置从第一天到第一个星期一到下一个星期一的表的周数,依此类推。我可以很容易地获得第一天和一年的第一个星期一,但我不知道如何从第一个星期一开始每隔7天增加一次,以便我可以设置周数。

我有这样的事情:

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

2 个答案:

答案 0 :(得分:3)

由于datepart(week,datefield)函数根据星期日作为一周的第一天获得周数,所以您只需检查datepart(weekday,datefield)以及它是1(星期日)还是2(星期一) ,从datepart(week,datefield)函数中减去1:

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

答案 1 :(得分:0)

我不确定所有关于“星期一”的谈话是什么意思,但是如果你想要从某个约会那里获得周数,你可以这样做:

UPDATE table
SET weeknumberofyear = DATEPART(wk, datefield)