2
votes

Récupérer l'année et le numéro de semaine à partir de la date dans SQL Server

J'essaie de récupérer le numéro de l'année et le numéro de la semaine au format 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)) 

Cela a bien fonctionné jusqu'en décembre 2018. Mais quand j'essaye ceci pour la date 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.

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


3 commentaires

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.


4 Réponses :


2
votes

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') )


7 commentaires

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



0
votes

Le bloc de code ci-dessous n'est pas la solution exacte, mais il vous aide certainement.

SQL

DECLARE @Dt datetime

SELECT @Dt='02-21-2008'

SELECT DATEPART( wk, @Dt)


2 commentaires

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')



0
votes

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))


0 commentaires

2
votes

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


0 commentaires