Подтвердить что ты не робот

Как получить номер недели месяца с даты в 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.

4b9b3361

Ответ 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