2014-04-03 75 views
0

我有一個要求,可以設置從第一天到第一個星期一到下一個星期一等等的表格的星期數。我可以很容易地得到第一天和第一個星期一,但我不知道如何從第一個星期一開始每隔7天增加一次,以便設置星期數。根據年份第一個星期一設置週數

我有這樣的事情:

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

你可以改寫你的問題,使其更清晰?我讀了五次,我不明白。 –

+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 

編輯這並不佔年的時候週日或週一是一年的第一天。在這些情況下,您將得到0爲weeknumberofyear。要解決此問題,請對錶格執行第二次更新。儘管這需要兩次更新,但我仍然認爲它比循環遍歷所有記錄更高效。

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 
+0

這工作,正是我一直在尋找。謝謝。我也必須在幾周內做同樣的工作,但我無法將此應用於該問題。它應該是大致相同的東西。有任何想法嗎? –

+0

非常歡迎您!樂於幫助。 :) 星期二是有點棘手,因爲想要在星期二開始一週,但如果你使用標準的月份數字,它應該是'設置monthnumberoftheyear = month(datefiled)'。 –

+0

感謝您的幫助,但我需要以上述代碼在整個一年中獲得的相同方式獲得「星期數」。所以它應該只設置從1到5的週數或者每個月的數量。如果這是有道理的,我認爲你正在更多地討論設置月份值。對不起,如果我不夠清楚。 –

0

我不知道你所說的所有人都在談論「星期一」的意思,但如果你正在尋找一個日期得到週數,您可以做這樣的事情:

UPDATE table 
SET weeknumberofyear = DATEPART(wk, datefield) 
相關問題