Comment séparer la semaine du lundi

J'ai un problème comment séparer la semaine selon le mois. En fait ma semaine commence à partir de lundi et en semaine de server sql commence à partir de dimanche et cela crée le problème. Je dois écrire le code si la date doit être divisée en jours et semaines si la date de début et de fin donnée par l'user a une différence de date de plus de 30 et less de 90. Ceci est fait comme ceci- D'abord je dois find que est la date de début si la date de début tombe le lundi puis son ok autre que ce premier je dois find quand est le lundi précédent pour ce que j'ai trouvé-

declare @enddate date = '2015-08-01'; select convert (date, DATEADD(wk, DATEDIFF(wk, 0,@enddate),0)) 

Mais cela ne marchera pas si la date de début est dimanche pour cela J'ai ajouté une variable qui vérifie quel jour est le jour du début si c'est dimanche alors je l'ai mis à 1 puis j'ai changé mon code pour – (pour dimanche seulement)

 declare @enddate date = '2015-08-02'; select convert (date, DATEADD(wk, DATEDIFF(wk, 6,@enddate),0)) 

Le principal problème pour moi est de savoir comment séparer les semaines. Je divise les semaines par le code donné. Ceci est une date d'exemple

 declare @enddate date = '2015-11-03'; SELECT 'Week ' + CAST(DATEPART(WEEK,@ENDDATE) - DATEPART(WEEK,DATENAME(YEAR,@ENDDATE) + '/' + DATENAME(MONTH,@ENDDATE) + '/' + '1') AS NVARCHAR)+ ' ' + DATENAME(MONTH,@ENDDATE) 

L'ouptut est …

 Week 0 November 

Et il montre la semaine 0 pour toutes les dates entre le 1er et le 7 novembre

Quelqu'un peut-il m'aider pourquoi il montre la semaine 0 pas la semaine 2 comme ma semaine commence à partir de lundi et novembre 2015 commence à partir du dimanche afin que seul jour devrait être la semaine 1 et du 2 novembre au 8 novembre devrait être la semaine 2 commenter si vous ne comprenez pas quelque chose, j'ai aussi essayé de google et essayé ce site lui-même d'abord, mais ne trouvez rien

EDITED- veux une logique afin que je puisse séparer la semaine du lundi au dimanche, mais je ne suis pas en mesure de l'get comme-

Si le mois change d'une semaine à l'autre, la semaine du 30 au mois devrait se terminer ici et le mois prochain le mercredi suivant. La nouvelle semaine du mois commence le mercredi et se termine la première semaine du mois.

Dans mon cas, la logique, je l'ai, mais pour spécifiquement Novembre 2015, je ne suis pas en mesure de l'get.

sortie requirejse

 Start date -2015-09-07 End date-2015-11-01 Output Start date End date Week 2 September Week 1 November Start date -2015-09-07 End date-2015-11-05 Output - Start date End date Week 2 September Week 1 November 2015-11-02 2015-11-05 Start date -2015-09-07 End date-2015-11-08 Output - Start date End date Week 2 September Week 2 November Start date -2015-09-08 End date-2015-11-05 Start date End date 2015-09-08 2015-09-13 Week 3 September Week 1 November 2015-11-02 2015-11-05 

Le problème est la façon dont vous calculez la semaine du mois

Cela devrait vous donner le résultat souhaité:

  SET DATEFIRST 1; go alter function WeekOfMonth (@Day Date) returns int as begin return DATEPART(wk, @Day) - DATEPART(wk, CAST(DATEADD(month, DATEDIFF(month, 0, @day), 0) AS DATE)) + 1 end go declare @startdate date = '2015-09-07'; declare @enddate date = '2015-11-03'; 

-Avec l'utilisation d'un FDU

 SELECT @startdate as "Start date", 'Week ' + cast(dbo.WeekOfMonth(@startdate) as NVARCHAR) + ' ' + DATENAME(MONTH,@ENDDATE) 

-Sans utilisation d'un FDU

 SELECT @enddate as "End date", 'Week ' + cast(DATEPART(wk, @enddate) - DATEPART(wk, CAST(DATEADD(month, DATEDIFF(month, 0, @enddate), 0) AS DATE)) + 1 as NVARCHAR) + ' ' + DATENAME(MONTH,@ENDDATE) 

Cela donne la sortie correcte:

 declare @data table(id int identity(0, 1), startdate date, enddate date) insert into @data(startdate, enddate) values ('20150906', '20151101') , ('20150907', '20151102') , ('20150907', '20151103') , ('20150907', '20151104') , ('20150907', '20151105') , ('20150907', '20151108') , ('20150908', '20151108') , ('20150908', '20151109') SET DATEFIRST 1 -- days before weeks Select id, type = 0, startdate, enddate , [Start Date] = Cast(startdate as varchar(10)), [End Date] = Cast(DATEADD(DAY, (7-DATEPART(WEEKDAY, startdate))%7, startdate) as varchar(10)) From @data Where DATEPART(WEEKDAY, startdate) <> 1 Union All -- Weeks Select id, type = 1, startdate, enddate , 'Week ' + Cast(( DATEPART(WEEK, startdate) - DATEPART(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, startdate), 0)) + 1 + Case When DATEPART(WEEKDAY, startdate) <> 1 then 1 else 0 end ) as varchar(10)) + ' ' + DATENAME(MONTH,startdate) , 'Week ' + Cast(DATEPART(WEEK, enddate) - DATEPART(WEEK, DATEADD(MONTH, DATEDIFF(MONTH, 0, enddate), 0)) + 1 as varchar(10)) + ' ' + DATENAME(MONTH,enddate) From @data Union All -- Days after weeks Select id, type = 2, startdate, enddate , cast(DATEADD(DAY, -(DATEPART(WEEKDAY, enddate)+6)%7, enddate) as varchar(10)) , cast(enddate as varchar(10)) From @data Where DATEPART(WEEKDAY, enddate) <> 7 Order By id, type 

Sortie:

 id type startdate enddate Start Date End Date 0 0 2015-09-06 2015-11-01 2015-09-06 2015-09-06 0 1 2015-09-06 2015-11-01 Week 2 September Week 1 November 1 1 2015-09-07 2015-11-02 Week 2 September Week 2 November 1 2 2015-09-07 2015-11-02 2015-11-02 2015-11-02 2 1 2015-09-07 2015-11-03 Week 2 September Week 2 November 2 2 2015-09-07 2015-11-03 2015-11-02 2015-11-03 3 1 2015-09-07 2015-11-04 Week 2 September Week 2 November 3 2 2015-09-07 2015-11-04 2015-11-02 2015-11-04 4 1 2015-09-07 2015-11-05 Week 2 September Week 2 November 4 2 2015-09-07 2015-11-05 2015-11-02 2015-11-05 5 1 2015-09-07 2015-11-08 Week 2 September Week 2 November 6 0 2015-09-08 2015-11-08 2015-09-08 2015-09-13 6 1 2015-09-08 2015-11-08 Week 3 September Week 2 November 7 0 2015-09-08 2015-11-09 2015-09-08 2015-09-13 7 1 2015-09-08 2015-11-09 Week 3 September Week 3 November 7 2 2015-09-08 2015-11-09 2015-11-09 2015-11-09