2014-02-11 3 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

Вот 2 различных способа, оба предполагающие неделя начинается в понедельник

Если вы хотите недели быть цельным, поэтому они относятся к месяцу, в котором они начинают: Так субботе 2012-09-01 и воскресенье 2012-09-02 в неделю 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-09-02 в неделю 1 и понедельника 2012-09-03 - это неделя 2:

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 

Реф. SET DATEFIRST (Transact-SQL) - Устанавливает первый день недели на число от 1 до 7. Английское значение по умолчанию в США - 7, воскресенье.

+0

Я уже пробовал это. SQL не позволяет использовать set datefirst в функции. Любые другие предложения? – user2871996

Смежные вопросы