Mauvais calcul du nombre de semaines US pour le 1er janvier en utilisant datepart

La fonction DATEPART du server SQL dispose de deux options pour récupérer le numéro de semaine; ISO_WEEK et WEEK . Je sais la différence entre les deux, je veux avoir des numéros de semaine basés sur la norme de départ du dimanche comme suit aux États-Unis; c'est à dire WEEK . Mais il ne gère pas les semaines partielles comme je l'espérais. par exemple

 SELECT DATEPART(WEEK,'2015-12-31') --53 SELECT DATEPART(WEEK,'2016-01-01') --1 SELECT DATEPART(WEEK,'2016-01-03') --2 

donne deux numéros de semaine différents pour une semaine, divisés en deux ans. Je voulais mettre en place quelque chose comme dans le lien suivant pour les jours de la semaine.

Numéros de semaine selon la norme américaine

Fondamentalement, je voudrais quelque chose comme ça;

 SELECT DATEPART(WEEK,'2015-12-31') --1 SELECT DATEPART(WEEK,'2016-01-01') --1 SELECT DATEPART(WEEK,'2016-01-03') --2 

EDIT: Fondamentalement, je ne suis pas bon avec la division d'une semaine en deux, je dois effectuer quelques calculs basés sur les numéros de semaine et le fait qu'une seule semaine à split n'est pas acceptable. Donc, si ci-dessus n'est pas possible.

Est-il possible que la semaine numéro un commence à partir de 2016-01-03. ce que je ferais dans ce cas serait quelque chose comme ceci:

 SELECT DATEPART(WEEK,'2015-12-31') --53 SELECT DATEPART(WEEK,'2016-01-01') --53 SELECT DATEPART(WEEK,'2016-01-03') --1 

Si vous voulez la numérotation américaine, vous pouvez le faire en prenant le numéro de semaine de la fin de la semaine plutôt que la date elle-même.

Assurez-vous d'abord que le réglage du premier jour de la semaine est en fait le dimanche sur votre système. Vous pouvez le vérifier en exécutant SELECT @@DATEFIRST ; cela devrait revenir 7 pour dimanche. Si ce n'est pas le cas, exécutez SET DATEFIRST 7; premier.

 SELECT end_of_week=DATEADD(DAY, 7-(DATEPART(WEEKDAY, '20151231')), '20151231'), week_day=DATEPART(WEEK, DATEADD(DAY, 7-(DATEPART(WEEKDAY, '20151231')), '20151231')); 

Ce qui reviendra 2016/01/02 – 1.

Si vous souhaitez générer le numéro de semaine d'une date, il renverra le numéro de semaine de l'année (date d'input)

Ainsi, je pense que sql server traite '2015-12-31' comme la dernière semaine de 2015.