TSQL Вычисляет номер недели месяца

#sql-server #tsql

#sql-сервер #tsql

Вопрос:

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

Комментарии:

1. перечислите некоторые примерные даты и ожидаемые результаты

Ответ №1:

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

 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
  

Комментарии:

1. Это отличная идея, Ричард. Не могли бы вы также помочь с тем, как мы можем сделать обратное — указав месяц и номер недели, можем ли мы получить первую и последнюю даты в этом номере недели?

Ответ №2:

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

 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;
  

Ответ №4:

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

 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
  

Комментарии:

1. Выдает неправильный ответ (по моему определению — см. Мой ответ) — в нем говорится, что это на неделе 1

2. Приведенный выше запрос выдает, является ли для данной даты неделя четной или нечетной неделей месяца…

Ответ №5:

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

 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]