web-dev-qa-db-fra.com

Comment obtenir le numéro de semaine du mois à partir de la date dans SQL Server 2008

Dans l'instruction SQL dans Microsoft SQL Server, il existe une fonction intégrée pour obtenir le numéro de semaine, mais il s'agit de la semaine de l'année.

Select DatePart(week, '2012/11/30') // **returns 48**

La valeur renvoyée 48 est le numéro de semaine de l'année. 

Au lieu de 48 , je souhaite obtenir 1, 2, 3 ou 4 (numéro de semaine du mois). Je pense que le nombre de semaines du mois peut être atteint par des modules avec le numéro de mois de cette semaine. Par exemple.

Select DATEPART(week, '2012/11/30')%MONTH('2012/11/30')

Mais je veux savoir s'il existe d'autres fonctions intégrées pour obtenir le numéro de semaine du mois dans MS SQL SERVER.

24
Nay Lin Aung

Voici 2 façons différentes, les deux supposent que la semaine commence le lundi

Si vous voulez que les semaines soient complètes, elles appartiennent donc au mois dans lequel elles commencent: Donc, samedi 2012-09-01 et dimanche 2012-09-02 correspond à la semaine 4 et le lundi 2012-09-03 à la semaine 1. ce:

declare @date datetime = '2012-09-01'
select datepart(day, datediff(day, 0, @date)/7 * 7)/7 + 1

Si vos semaines sont moins nombreuses, changez donc samedi 12-09-01 et dimanche 2012-09-02 à la semaine 1 et lundi 2012-09-03 à la semaine 2, utilisez ceci:

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
42
t-clausen.dk
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
10
Passakorn

Pas de fonction intégrée. Cela dépend de ce que vous entendez par semaine du mois. Vous pourriez dire que ce soit dans les 7 premiers jours (semaine 1), les 7 autres jours (semaine 2), etc. Dans ce cas, il serait simplement 

(DATEPART(day,@Date)-1)/7 + 1

Si vous souhaitez utiliser la même numérotation hebdomadaire que celle utilisée avec DATEPART (semaine,), vous pouvez utiliser la différence entre les numéros de semaine du premier mois et la date en question (+1): 

(DATEPART(week,@Date)- DATEPART(week,DATEADD(m, DATEDIFF(m, 0, @Date), 0))) + 1 

Ou, vous pourriez avoir besoin de quelque chose d'autre, selon ce que vous entendez par le numéro de semaine.

4
GilM

Il suffit de regarder la date et de voir dans quelle plage il se situe.

La plage 1-7 est la 1ère semaine, la plage 8-14 est la 2ème semaine, etc.

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
4
Bryan Focht

Une doublure sale mais facile à utiliser grâce à la fonction Dense_Rank. Les performances en souffriront, mais elles n'en seront pas moins efficaces.

DENSE_RANK()over(Partition by Month(yourdate),Year(yourdate) Order by Datepart(week,yourdate) asc) as Week
1
Brennan Webb

Essayez ci-dessous Code:

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)
1
P. Sandip
floor((day(@DateValue)-1)/7)+1
1
Peter

Voici....

J'utilise le code ci-dessous.

DATEPART(WK,@DATE_INSERT) - DATEPART(WK,DATEADD(DAY,1,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DATE_INSERT),0)))) + 1
1
Jonathan Takeishi

Similaire à la deuxième solution, moins de code:

declare @date datetime = '2014-03-31'
SELECT DATEDIFF(week,0,@date) - (DATEDIFF(week,0,DATEADD(dd, -DAY(@date)+1, @date))-1)
1
DBADale

Regarde ça ... ça fonctionne bien.

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
1
Sid

Il n'y a pas de fonction intégrée pour vous obtenir le numéro de semaine. Je ne pense pas que la division vous aidera de toute façon car le nombre de semaines dans un mois n’est pas constant.

http://msdn.Microsoft.com/en-us/library/bb675168.aspx

Je suppose que vous pouvez diviser le nombre (48) par 4 et prendre les modules de la même chose et le projeter comme numéro de semaine du mois en ajoutant un au résultat.

1
Anil

Voici la requête qui indique le numéro de semaine de la variable startday et endday de la semaine.

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

Pour plus d'informations, j'ai répondu à la question ci-dessous. Peut vérifier ça.

1
Sarath Avanavu

Voici une suggestion pour obtenir les premier et dernier jours de la semaine pendant un mois: 

-- 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
1
M Keltz
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];
0
Stack Trader

Vous pouvez simplement obtenir le numéro de semaine en obtenant le nombre minimum de mois et le déduire du nombre de semaines. Supposons que vous ayez une table avec des dates

select
    emp_id, dt , datepart(wk,dt) - (select min(datepart(wk,dt))
from
    workdates ) + 1 from workdates
0
Raj Dhawan

Solution:

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)
0
Ankita Gavhane