#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]