declare @date datetime
set @date = '2010-02-01'declare @firstday datetime,
        @lastday datetimeset @firstday = cast(convert(varchar(6),@date,112)+'01' as datetime)
set @lastday =  cast(convert(varchar(6),dateadd(dd,32,@firstday),112)+'01' as datetime) -1SET DATEFIRST 1
select datepart(wk,@lastday) - datepart(wk,@firstday)+1

解决方案 »

  1.   

    計算出所在週的開始日期和結束日期a,如何在Sql Server中已知週次,計算出所在週的開始日期和結束日期
    在Sql Server中有這樣一個函數DATEPART,我們可以使用它傳回代表指定日期的指定日期部份之整數。語法為DATEPART ( datepart , date ),我們所熟知的DAY、MONTH 和 YEAR 等函數分別是 DATEPART(dd, date)、DATEPART(mm, date) 與 DATEPART(yy, date) 的同義字。用DATEPART(wk,date),就可以得到日期所在的週數,而如果反過來,從週數得到這一週的七天,就需要我們自己來寫了。
    首先我們分析一下,有週數就一定可以算出這一週的七天嗎?不,因爲每年的相同週數的七天日期都不一樣,所以我們需要知道的必要條件是:年數和週數。兩者缺一不可。
    在Sql Server中每週的開始是週日,最後一天是週六。每年的第一週是從1月1號到第一個週六,每年的最後一週是從最後一個週日到12月31號,因此每年的第一週和最後一週是不完整的。如果我們需要得出給定週次的開始日期和結束日期,那麽先計算出第一週的結束日期,然後加上7*週次,就可得出給定週次的結束日期,在把這個日期減去6,就是給定週次的開始日期。在這裡我們可以使用DATEADD函數,它的作用是在指定日期新增一個時間間隔,並傳回新的 datetime 值。語法:DATEADD ( datepart , number, date ) 那麽代碼可以是這樣的:
    declare @week int;
    set @week=9;
    Select dateadd(day,-6, dateadd(day,7 * (@week-1),第一週的最後一天),dateadd(day,7 * (@week-1),第一週的最後一天)
    code 1
        那麽我們接下來的任務就是算出第一週的最後一天了,因爲給定年數,所以我們可以先用函數DATEPART算出1月1號星期幾,再加上相應的的天數即可:
    Select datepart(dw,’2000/1/1’)  /*假設給定的年數是2000年,取得一月一號是週幾*/
    Code 2
    一月一號再過(7- datepart(dw,’2000/1/1’))天,就是第一週的最後一天:
    Select dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’)
    Code 3
        我們把第一週的最後一天加入到code 1里去,就得到了如下的代碼:
    declare @week int;
    set @week=9;
    Select dateadd(day,-6, dateadd(day,7 * (@week-1), dateadd(day, (7-   datepart(dw,’2000/1/1’)),’2000/1/1’)),dateadd(day,7 * (@week-1), dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’))
    code 4
    那麽得到當前日期的函數是getdate(),得到當前週數的函數就是datepart(dw,getdate());我們用datepart(dw,getdate())去取代code 4的@ week,就像下面一樣:
    Select 
    dateadd(day,-6, dateadd(day,7 * (datepart(dw,getdate())-1), dateadd(day, (7-   datepart(dw,’2000/1/1’)),’2000/1/1’)),
    dateadd(day,7 * (datepart(dw,getdate())-1), dateadd(day, (7- datepart(dw,’2000/1/1’)),’2000/1/1’))
    Code 5
    是否可以得到当前日期所在周的開始日期和結束日期呢?那肯定是對的,可是我們有更簡單的方法。請看下一節……b, 如何在Sql Server中已知日期,計算出所在週的開始日期和結束日期
        既然已經知道日期了,那麽我們可以算出日期是星期幾,用dateadd函數兩頭一減,就可以算出所在週的開始日期和結束日期,需要説明的是,在Sql Server中,雖然month的範圍是1~12,day of year的範圍是1~366,day的範圍是1~31,可是week的範圍卻是0~6,0代表星期六,1,代表星期一,以此類推,千萬不要認爲1~7哦!
    見下表:
    Datepart 縮寫 取值範圍
    Year yy, yyyy 1753~9999
    Quarter qq, q 1~4
    Month mm, m 1~12
    Dayofyear dy, y 1~366
    Day dd, d 1~31
    Week wk, ww 0~51
    Hour hh 0~23
    Minute mi, n 1~59
    Second ss, s 1~59
    Millisecond ms 0~999代碼如下:
    Select 
    dateadd(dy,1-datepart(dw,getdate()),getdate()),
    dateadd(dy,7-datepart(dw,getdate()),getdate())
    Code 6
    是不是code6比code5簡單多了?其實有時候我們想算法的時候,會很容易走錯路,雖然最後還是走到終點,卻發現是繞了一段遠路,我在coding的時候就是這樣的,唉,需要改進。
      

  2.   

    我是在作月销售报表(按周分类)时碰到的这个问题,又没有考虑用交叉表。所以不但要算一个月几周,还要算出每周的分隔日期,所以需要每月第一个星期一。然后每周加上7日,通过一个月几周算出是否到月末。作为一个coder,我们追求的第一要素是达到目的,有时可能要走一些弯路,回头也不会特意去分析为什么要这么做。不知道Chiff(~o~) 是否一样。如piccologoo(piccolo)能对一个问题作出如此分析,也许真是我们所要学习的。