sql server 2008 week Comment obtenir le numéro de semaine du mois à partir de la date dans le serveur SQL 2008




sql server weekday (13)

Une doublure sale mais facile à utiliser avec la fonction Dense_Rank. La performance en souffrira, mais efficace néanmoins.

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

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

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

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

Au lieu de 48 , je veux obtenir 1, 2, 3 ou 4 (numéro de semaine du mois). Je pense que le numéro de semaine du mois peut être obtenu par 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 y a d'autres fonctions intégrées pour obtenir WeekNumber du mois dans MS SQL SERVER.


Voici deux manières différentes, les deux supposent que la semaine commence lundi

Si vous voulez que les semaines soient complètes, elles appartiennent donc au mois où elles commencent: Donc samedi 2012-09-01 et dimanche 2012-09-02 c'est la semaine 4 et lundi 2012-09-03 est la semaine 1 utilisez ceci:

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

Si vos semaines de mois changent le samedi 2012-09-01 et le dimanche 2012-09-02 est la semaine 1 et le lundi 2012-09-03 est 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

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)

Regardez ça ... ça marche 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

Vous pouvez simplement obtenir le numéro de la semaine en obtenant le numéro de semaine minimum du mois et le déduire du numéro de la semaine. 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

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

La plage 1-7 est la 1ère semaine, la gamme 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

Le code est ci-dessous:

set datefirst 7
declare @dt datetime='29/04/2016 00:00:00'
select (day(@dt)+datepart(WEEKDAY,dateadd(d,-day(@dt),@dt+1)))/7

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

Essayez ci-dessous le 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)

Voici la requête qui amène le numéro de semaine quel que soit le jour de startday et la endday de semaine 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.


Semblable à 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)

Voici....

Im en utilisant 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

Voici une suggestion pour obtenir le premier et le dernier jour 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




tsql