Как получить номер недели месяца с даты в SQL Server 2008
В SQL-заявлении на сервере microsoft sql есть встроенная функция для получения номера недели, но это неделя года.
Select DatePart(week, '2012/11/30') // **returns 48**
Возвращаемое значение 48 - это номер недели года.
Вместо 48 я хочу получить 1, 2, 3 или 4 (номер недели месяца). Я думаю, что число недель месяца может быть достигнуто модулями с месяцем числа этой недели. Например,
Select DATEPART(week, '2012/11/30')%MONTH('2012/11/30')
Но я хочу знать, есть ли другие встроенные функции, чтобы получить WeekNumber месяца в MS SQL SERVER.
Ответы
Ответ 1
Вот два разных способа, оба предполагают начало недели в понедельник
Если вы хотите, чтобы недели были целыми, поэтому они относятся к тому месяцу, в котором они начинаются:
Таким образом, суббота 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
Если ваши месяцы сократились в течение месяца, поэтому суббота 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
Ответ 2
DECLARE @DATE DATETIME
SET @DATE = '2013-08-04'
SELECT DATEPART(WEEK, @DATE) -
DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0))+ 1 AS WEEK_OF_MONTH
Ответ 3
Нет встроенной функции. Это зависит от того, что вы подразумеваете под неделями месяца. Вы могли бы означать, будет ли это в первые 7 дней (неделя 1), вторые 7 дней (неделя 2) и т.д. В этом случае это будет просто
(DATEPART(day,@Date)-1)/7 + 1
Если вы хотите использовать нумерацию той же недели, что и для DATEPART (неделя), вы можете использовать разницу между номерами недель первого месяца и указанной датой (+1):
(DATEPART(week,@Date)- DATEPART(week,DATEADD(m, DATEDIFF(m, 0, @Date), 0))) + 1
Или вам может понадобиться что-то другое, в зависимости от того, что вы подразумеваете под номером недели.
Ответ 4
Просто посмотрите дату и посмотрите, в каком диапазоне она попадает.
Диапазон 1-7 - 1-я неделя, диапазон 8-14 - вторая неделя и т.д.
SELECT
CASE WHEN DATEPART(day,yourdate) < 8 THEN '1'
ELSE CASE WHEN DATEPART(day,yourdate) < 15 then '2'
ELSE CASE WHEN DATEPART(day,yourdate) < 22 then '3'
ELSE CASE WHEN DATEPART(day,yourdate) < 29 then '4'
ELSE '5'
END
END
END
END
Ответ 5
Как и во втором решении, меньше кода:
declare @date datetime = '2014-03-31'
SELECT DATEDIFF(week,0,@date) - (DATEDIFF(week,0,DATEADD(dd, -DAY(@date)+1, @date))-1)
Ответ 6
Нет встроенной функции, чтобы получить номер недели. Я не думаю, что разделение поможет вам в любом случае, так как количество недель в месяц не является постоянным.
http://msdn.microsoft.com/en-us/library/bb675168.aspx
Я думаю, вы можете разделить число (48) на 4 и взять модули того же самого и спроектировать, что в качестве номера недели этого месяца, добавив его к результату.
Ответ 7
Здесь предлагается получить первый и последний дни недели в течение месяца:
-- Build a temp table with all the dates of the month
drop table #tmp_datesforMonth
go
declare @begDate datetime
declare @endDate datetime
set @begDate = '6/1/13'
set @endDate = '6/30/13';
WITH N(n) AS
( SELECT 0
UNION ALL
SELECT n+1
FROM N
WHERE n <= datepart(dd,@enddate)
)
SELECT DATEADD(dd,n,@BegDate) as dDate
into #tmp_datesforMonth
FROM N
WHERE MONTH(DATEADD(dd,n,@BegDate)) = MONTH(@BegDate)
--- pull results showing the weeks' dates and the week # for the month (not the week # for the current month)
select MIN(dDate) as BegOfWeek
, MAX(dDate) as EndOfWeek
, datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, dDate), 0)), 0), dDate) as WeekNumForMonth
from #tmp_datesforMonth
group by datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, dDate), 0)), 0), dDate)
order by 3, 1
Ответ 8
Проверьте это... его работоспособность.
declare @date as datetime = '2014-03-10'
select DATEPART(week,@date) - DATEPART(week,cast(cast(year(@date) as varchar(4))+'-' + cast(month(@date) as varchar(2)) + '-01' as datetime))+1
Ответ 9
Грязный, но простой один вкладыш с использованием функции Dense_Rank. Производительность будет страдать, но, тем не менее, эффективнее.
DENSE_RANK()over(Partition by Month(yourdate),Year(yourdate) Order by Datepart(week,yourdate) asc) as Week
Ответ 10
floor((day(@DateValue)-1)/7)+1
Ответ 11
Здесь вы идете....
Im, используя код ниже..
DATEPART(WK,@DATE_INSERT) - DATEPART(WK,DATEADD(DAY,1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DATE_INSERT),0)))) + 1
Ответ 12
Вот запрос, который приносит номер недели на любые startday
и endday
недели, которые могут быть.
SET DATEFIRST 2
DECLARE @FROMDATE DATE='12-JAN-2015'
-- Get the first day of month
DECLARE @ALLDATE DATE=DATEADD(month, DATEDIFF(month, 0, @FROMDATE), 0)
DECLARE @FIRSTDATE DATE
;WITH CTE as
(
-- Get all dates in that month
SELECT 1 RNO,CAST(@ALLDATE AS DATE) as DATES
UNION ALL
SELECT RNO+1, DATEADD(DAY,1,DATES )
FROM CTE
WHERE DATES < DATEADD(MONTH,1,@ALLDATE)
)
-- Retrieves the first day of week, ie, if first day of week is Tuesday, it selects first Tuesday
SELECT TOP 1 @FIRSTDATE = DATES
FROM CTE
WHERE DATEPART(W,DATES)=1
SELECT (DATEDIFF(DAY,@FIRSTDATE,@FROMDATE)/7)+1 WEEKNO
За дополнительной информацией я ответил на следующий вопрос. Можете проверить это.
Ответ 13
Попробуйте ниже код:
declare @dt datetime='2018-03-15 05:16:00.000'
IF (Select (DatePart(DAY,@dt)%7))>0
Select (DatePart(DAY,@dt)/7) +1
ELSE
Select (DatePart(DAY,@dt)/7)
Ответ 14
WeekMonth = CASE WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 22 THEN '5'
WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 15 THEN '4'
WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 8 THEN '3'
WHEN (DATEPART(day,TestDate) - datepart(dw,TestDate))>= 1 THEN '2'
ELSE '1'
END
Ответ 15
Вы можете просто получить номер недели, получив минимальный номер месяца в месяц и вычтите его с номера недели. Предположим, у вас есть таблица с датами
select
emp_id, dt , datepart(wk,dt) - (select min(datepart(wk,dt))
from
workdates ) + 1 from workdates
Ответ 16
Решение:
declare @dt datetime='2018-03-31 05:16:00.000'
IF (Select (DatePart(DAY,@dt)%7))>0
Select (DatePart(DAY,@dt)/7) +1
ELSE
Select (DatePart(DAY,@dt)/7)
Ответ 17
declare @end_date datetime = '2019-02-28';
select datepart(week, @end_date) - datepart(week, convert(datetime, substring(convert(nvarchar, convert(datetime, @end_date), 127), 1, 8) + '01')) + 1 [Week of Month];
Ответ 18
Вот проверенное решение для этого запроса в любой ситуации - например, если 1-е число месяца в пятницу, то также это будет работать -
select (DATEPART(wk,@date_given)-DATEPART(wk,dateadd(d,1-day(@date_given),@date_given)))+1
выше приведены некоторые решения, которые потерпят неудачу, если первая дата месяца будет в пятницу, а 4-й будет 2-ая неделя месяца
Ответ 19
Логика здесь работает также 4,3 недели в каждом месяце. Возьмите это из DATEPART (WEEK) каждый месяц, кроме января. Просто еще один взгляд на вещи. Это также будет учитывать месяцы, когда есть 5-я неделя
DECLARE @date VARCHAR(10)
SET @date = '7/27/2019'
SELECT CEILING(DATEPART(WEEK,@date)-((DATEPART(MONTH,@date)-1)*4.3333)) 'Week of Month'
Ответ 20
Существует встроенная опция для получения номера недели года
**select datepart(week,getdate())**
Ответ 21
Код ниже:
set datefirst 7
declare @dt datetime='29/04/2016 00:00:00'
select (day(@dt)+datepart(WEEKDAY,dateadd(d,-day(@dt),@dt+1)))/7