2014-02-11 127 views
0

開始我有這個功能非常適用於計算一個月的一週 - 我需要它開始的一週從週一計算每週週一

CREATE FUNCTION dbo.ufs_FirstofMonth (@theDate DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 
    RETURN (DATEADD(d, (DAY(@theDate)-1) * (-1) ,@theDate)) 
END 

GO 

CREATE FUNCTION dbo.ufs_FirstSunday (@theDate DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 
    RETURN (DATEADD(d, CASE WHEN DATEPART (dw , dbo.ufs_FirstofMonth(@theDate)) = 1 THEN 0 
         ELSE 8-DATEPART (dw , dbo.ufs_FirstofMonth(@theDate)) 
         END 
        , dbo.ufs_FirstofMonth(@theDate))) 
END 

GO 

CREATE FUNCTION dbo.ufs_WeekOfMonth (@theDate DATETIME) 
RETURNS INTEGER 
AS 
BEGIN 
    RETURN (CASE WHEN DATEPART (dw , @theDate) > DAY(@theDate) 
         THEN 1 + DATEDIFF(wk, dbo.ufs_FirstSunday(DATEADD(mm,-1,@theDate)) , @theDate) 
        ELSE 1 + DATEDIFF(wk, dbo.ufs_FirstSunday(@theDate) , @theDate) 
      END 
      ) 
END 

回答

3

這裏有兩種不同的方式,兩者都假定每週週一開始

如果你想周保持完整,所以他們屬於一個月中,他們開始:所以週六2012-09-01,週日2012-08-30爲4周,週一2012-09-03本週是1個使用這樣的:

declare @date datetime = '2012-09-01' 
select datepart(day, datediff(day, 0, @date)/7 * 7)/7 + 1 

如果削減你的星期monthchange所以週六2012-09-01,週日2012-08-30周是1 and monday 2012-09-03 is week 2 use this:

declare @date datetime = '2012-09-01' 
select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0),  @date - 1) + 1 
+0

第一個代碼完美工作 - 謝謝! – user2871996

0

添加出發,按照你的函數的第一行:

SET DATEFIRST 1 -- Set Monday as the first day of the week 

Ref。 SET DATEFIRST (Transact-SQL) - 將星期的第一天設置爲1到7之間的數字。美國英語默認值爲7,星期日。

+0

我已經試過了。 SQL不允許在函數中使用set datefirst。還有其他建議嗎? – user2871996