2011-02-07 3 views
6

Я хочу рассчитать номер недели месяца, я хочу рассчитать номер недели, может ли он получить нечетную или даже неделю, как я могу получить это в TSQL? Спасибо всем!TSQL Рассчитать недельный номер месяца

+2

список несколько примеров даты и ожидаемый выход – RichardTheKiwi

ответ

6

Это дает недели с момента @dt в его месяц. Существует 2-ой столбец, который использует саз над выражением, чтобы показать либо «Odd» или «Даже»

declare @dt datetime 
set @dt = GETDATE() 

select 
    WhichWeekOfMonth = datepart(wk, @dt) 
        - datepart(wk,dateadd(m, DATEDIFF(M, 0, @dt), 0)) + 1, 
    case when (datepart(wk, @dt) 
      - datepart(wk,dateadd(m, DATEDIFF(M, 0, @dt), 0)) + 1) % 2 = 1 
     then 'Odd' else 'Even' end 
+0

Это отличный Ричард. Можете ли вы также помочь с тем, как мы можем сделать обратное - если месяц и номер недели, можем ли мы получить первую и последнюю даты на этой неделе? – Jinith

0

Попробуйте это:

SELECT (DATEPART(d, '02/07/2011')/7)%2 AS WeekNo, --Replace your date column in place of '02/07/2011' 
     CASE (DATEPART(d, '02/07/2011')/7)%2 
       WHEN 1 THEN 'Odd' 
       ELSE 'Even' 
      END AS WeekType 
+0

дает неправильный ответ (по моему определению - см мой ответ) - он говорит, что он находится на неделе 1 – RichardTheKiwi

+0

. В приведенном выше вопросе указывается, будет ли для данной даты неделя равной недели или недели недели ... – Chandu

4

Это даст вам номер недели на каждый месяц

declare @dates datetime 
select @dates='2011-03-22' 
SELECT datepart(dd,@dates), ceiling (cast(datepart(dd,@dates)as numeric(38,8))/7) 
3

Как о что-то читаемый, легко настраиваемый, и предсказуем ...

DECLARE @dayOfMonth AS INT; 
SET @dayOfMonth = DATEPART(DAY, '3/14/2013'); 
SELECT CASE 
    WHEN @dayOfMonth < 8 THEN 1 
    WHEN @dayOfMonth < 15 THEN 2 
    WHEN @dayOfMonth < 22 THEN 3 
    ELSE 4 
END AS weekOfMonth; 
0

Я думаю, что это делает подход очень очевидное:

DECLARE @DayOne DATETIME 
DECLARE @ThisDay DATETIME 
SET @ThisDay = GETDATE() 
SET @DayOne = CAST(CAST(MONTH(@ThisDay) AS VARCHAR) + '/1/' + CAST(YEAR(@ThisDay) AS VARCHAR) AS DATETIME) 
SELECT (DATEPART(wk, @ThisDay) - DATEPART(wk, @DayOne) + 1) AS [Week Of Month] 

SQL Server 2012 имеет функцию CONCAT, которая может быть использована для более легко построить строку DayOne:

DECLARE @DayOne DATETIME 
DECLARE @ThisDay DATETIME 
SET @ThisDay = GETDATE() 
SET @DayOne = CAST(CONCAT(MONTH(@ThisDay), '/1/', YEAR(@ThisDay)) AS DATETIME) 
SELECT (DATEPART(wk, @ThisDay) - DATEPART(wk, @DayOne) + 1) AS [Week Of Month] 
Смежные вопросы