J'essaie de récupérer le numéro de l'année et le numéro de la semaine au format Cela a bien fonctionné jusqu'en décembre 2018. Mais quand j'essaye ceci pour la date Alors, comment puis-je récupérer la combinaison de numéros de semaine année avec précision tout au long de l'année yyyyww
comme 201901
, 201905
, 201911 code> etc et j'utilise cette requête pour le faire:
declare @BeginDate datetime
set @beginDate = '2019-02-07'
select
concat(datepart(year, @BeginDate), right('0' + convert(varchar, datepart(week, dateadd(day, -7 , @BeginDate))), 2))
2019-01-07
, cela a renvoyé 201953
qui n'est pas correct. Mais pour toutes les autres valeurs comme 2019-01-14, etc., il récupère correctement le numéro de semaine.
4 Réponses :
Vous pouvez essayer en utilisant le code suivant
201901
output
SELECT concat(year('2019-01-01'),Format(DATEPART( wk, '2019-01-01') , '00') )
ou
201902
sortie
SELECT concat(year('2019-01-07'),Format(datepart(day, datediff(day, 0, '2019-01-07')/7 * 7)/7 + 1 , '00') )
Ce code est défectueux: testé avec 2017-01-01
renvoie 201704
qui est sûrement faux, dbfiddle à lui: dbfiddle.uk/...
Maintenant, il dit semaine 201701 mais il est toujours défectueux car 1-1-2017 est la semaine 201652.
@DDS J'ai écrit du code pour un format spécifique (aaaa-mm_jj) car l'utilisateur a demandé un format spécifique
@ J'ai vu, mais ce n'est pas un problème (vous pouvez aussi simplement définir dateformat ymd
) pour préciser le format que vous utilisez
De plus, votre code a des problèmes à des dates telles que 2021-01-01 qui est 202053 mais votre code le signale comme 202105
@DDS maintenant quel est le problème yaar ma deuxième solution fonctionne sachez déjà que vous avez marqué ma réponse, j'ai corrigé parce que vous avez trouvé l'erreur que je dois vous donner
Le problème est que votre année commence toujours par la semaine 01, ce n'est pas vrai, du moins dans la plupart des pays du monde, où une année peut commencer avec la semaine précédente
Le bloc de code ci-dessous n'est pas la solution exacte, mais il vous aide certainement.
DECLARE @Dt datetime SELECT @Dt='02-21-2008' SELECT DATEPART( wk, @Dt)
cela renverra des valeurs de semaine comme 1,2, etc. J'en ai besoin comme 01,02 etc.
Fonction de format utilisateur pour obtenir le résultat comme prévu SELECT Format (DATEPART (wk, @Dt), '00')
Normalement, la manière la plus claire de calculer les parties standard d'une date est d'utiliser les fonctions standard. Donc, je propose d'utiliser DATEPART combiné avec RIGHT pour nous assurer que nous avons les deux caractères commençant par la droite:
DECLARE @DT AS DATE = '2019-01-07' SELECT CONCAT(year(@DT), RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(wk, @DT)), 2))
Vous ne considérez pas la définition de la «semaine de l'année»:
Selon Wikipédia: La semaine de la première année est la semaine contenant le premier jeudi de l'année ou soit la semaine contenant le 4 janvier, soit la semaine commençant entre le 29 décembre et le 4 janvier.
Donc, si l'année commence par la semaine 52 ou 53, c'est la fin de la semaine dernière de l'année précédente.
vous avez donc:
set dateformat ymd set datefirst 1 declare @data as datetime declare @year as int set @data = cast('2017-01-01' as datetime) set @year = case when datepart(iso_week,@data) >= 52 and month(@data) = 1 then year(@data)-1 when datepart(iso_week,@data) = 1 and month(@data) = 12 then year(@data)+1 else year(@data) end select concat (@year, right('0'+cast(datepart(iso_week,@data) as varchar(6)),2))
résultat de c'est 201652
edit: mis à jour pour avoir toujours une semaine à deux chiffres
Pourquoi soustrayez-vous 7 jours de la date de début? Notez que la partie de date
WEEK
n'est pas nécessairement aussi propre que vous le pensez. Une année donnée peut avoir 52 ou 53 semaines, car 52 semaines ne représentent que 364 jours, et une année peut avoir 365 ou 366 jours. Vous devez définir comment vous voulez compter une semaine.Puis-je vous demander pourquoi vous avez cette exigence particulière? C'est une question valable, mais cela semble être un tas de jiu-jitsu chaîne / date pour quelque chose d'aussi piéton qu'une valeur composite. Vous pourrez peut-être obtenir ce dont vous avez besoin d'une manière meilleure ou plus facile.
Le 01/01/2019 appartient à la 53ème semaine de 2018 ... tout dépend de la définition de la première semaine de l'année.