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.
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
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
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.
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
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
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)
floor((day(@DateValue)-1)/7)+1
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
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)
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
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.
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.
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
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];
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
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)