Comment obtenir le lundi, le dimanche basé sur un Numéro de la Semaine dans SQL Server?
J'ai un numéro de la semaine (p. 23) et je voudrais avoir les dates pour le lundi et le dimanche de cette semaine.
Je suis en supposant que lundi est le premier jour de la semaine (par exemple, j'ai SET DATEFIRST 1
dans mon script).
Pour cette année, est de 3-Jan-2011 le 2e lundi(*) le 1er ou le lundi. Pour les premiers, il n'y aurait pas de lundi de la "première semaine de l'année 2011"
Définir semaine 1 s'il vous plaît. ISO? Pays? en.wikipedia.org/wiki/ISO_week_date#Examples
Il est logique de le définir d'une manière qui est réversible à l'aide de Datepart(Semaine) dans SQL Server, qui ma réponse.
Définir semaine 1 s'il vous plaît. ISO? Pays? en.wikipedia.org/wiki/ISO_week_date#Examples
Il est logique de le définir d'une manière qui est réversible à l'aide de Datepart(Semaine) dans SQL Server, qui ma réponse.
OriginalL'auteur AngryHacker | 2011-02-02
Vous devez vous connecter pour publier un commentaire.
Edit:
Cette solution fonctionne si la semaine 1 ne démarre pas le jour 1 comme Andomar dit
Edit 2:
Selon Wikipédia: 2008-12-29 est le jour 1 de la semaine 1 de l'année 2009 en ISO.
Et les numéros de semaine varier comme Andomar dit
Cyberkiwi mentionné ce code est mauvais pour l'année 2007: c'est une erreur bien plus souvent que cela. La même chose s'applique à son code de trop qui correspond à 2007, mais est tout aussi mauvais que le reste.
Je ne le savais pas. Avoir la semaine 53 est assez mauvaise laisser seul quelques règles spéciales sur le début de l'année
qui être correct...
Les constantes peuvent être, mais l'idée est bonne. Sur mon système, il doit être
DATEADD(day, 2-DATEPART(weekday, '2007-01-01'), '2007-01-01')
(c'est à dire juste un changement de 8 à 2)pour ne pas être en TOC assez pour essayer Mauvaise excuse pour ne pas fournir de bonnes testé le code sur un forum public, avec une inclinaison à l'étiquetage d'autres comme
OCD
. Je demande des excusesOriginalL'auteur gbn
OriginalL'auteur Thomas
Un calendrier de table qui rend ce genre de la date de la requête assez simple. Un calendrier de table juste a la pertinente les détails du calendrier calculé et stocké au moment du chargement au lieu d'calculé au moment de l'exécution. Selon l'application, qui peut accélérer les choses beaucoup. Cette façon de sgbd agnostique; il utilise juste les littéraux de la clause where.
Et d'une autre qui s'appuie uniquement sur une table de dates.
EXTRAIT() est le standard SQL, mais je ne suis pas sûr de savoir si les noms des sous-champs isoyear, de la semaine, isodow sont standard SQL.
OriginalL'auteur Mike Sherrill 'Cat Recall'
Remarque: Toute réponse qui commence par supposer année 2011 pourrait tout aussi bien prendre une statique de la première date, c'est à dire en remplaçant @firstMon dans ma dernière requête ci-dessous avec juste la date statique '20101227'.
Et le réel, la finale de la requête qui retourne un Lun/Dim NULL quand il n'existe pas dans la semaine, comme Lun des partiels la semaine-un Soleil ou de la partie de la semaine-53
Pour GBN de prétendre que cette réponse est fausse (dans sa réponse), je vous soumets ci-dessous la preuve de l'exactitude
J'ai tourné le code dans une fonction.
Et ci-dessous je vous présente TOUTE la gamme des ans et des semaines (1-53) pour les années de 1950 à travers 2047. Dans CHAQUE cas, lorsque le lundi/dimanche a été déterminé, et de travail vers l'arrière à l'aide de
DATEPART(week)
, SQL Server est d'accord avec la numérotation des semaines à partir de la fonction.De sortie autour de l'2005-2006 passage
Il ne s'agit pas, vous êtes tout simplement pas à la lire correctement. Voir la partie ajoutée à la réponse.
OriginalL'auteur RichardTheKiwi
Vous pouvez essayer certains dateadd logique...
Mise à JOUR:
EXEMPLE: http://msdn.microsoft.com/en-us/library/ms186819.aspx
dateadd(week, ...
semble juste pour ajouter 7 jours. Donc, en utilisant cette méthode, en 2011, chaque semaine commence le samedi.Il convient d'ajouter le nombre de semaines précisé dans le 2e paramètre (23 ci-dessus)... voir la mise à jour de sql et les résultats ci-dessus...
Maintenant, vous êtes à l'ajout de 23 semaines et 23 jours:
dateadd(day, 23, dateadd(week, 23, '2011-01-01'))
vous ne savez Pas ce qu'est censé faire.Bon... je vais corriger cela il faut ajouter 7 jours, Merci
"DATEADD" est un construit-dans MSSQL (et TSQL) fonction qui prend 3 paramètres; la "partie" qui spécifie sur quelle partie de la date de retour avec une nouvelle valeur, le "nombre" qui est utilisée pour incrémenter la datepart et de la "date" qui indique la "date de début" pour l'addition. Dans mon exemple de code ci-dessus à partir du site web msdn, ils ont utilisé 2007-01-01 que la date de début... j'ai utilisé 2011-01-01 dans les 2 premiers exemples ci-dessus.
OriginalL'auteur John K.