0
votes

Obtenir le numéro de semaine à partir d'une liste de dates en SQL

J'essaie d'obtenir le numéro de semaine correspondant à partir des dates qui résultent de cette requête.

select Date,Time,EndDate,EndTime
FROM Test
WHERE (StartDate >= '01.01.2019')
ORDER BY StartDate

Fondamentalement, je veux ajouter à la colonne de fin le numéro de semaine de cette requête. Je ne peux pas modifier la base de données de toute façon, je veux juste extraire le numéro de la semaine des dates et l'avoir sous forme de colonne à la fin de mes résultats.

Exemple de données ci-dessous:

Résultats


6 commentaires

Désolé aurait dû élaborer, j'utilise juste SSMS sur un serveur SQL Express


Des exemples de données seraient très utiles ici.


Avez-vous regardé les options DATEPART () ?


La numérotation des semaines n'est pas la même partout, veuillez donc indiquer où vous êtes pour voir le schéma de numérotation nécessaire


Salut, je suis au Royaume-Uni


Utilisez donc iso_week au lieu de week (les premiers jours de janvier du nouvel an peuvent appartenir à la 52e ou 53e semaine de l'année précédente et le dernier jour de décembre peut également appartenir à la première semaine du nouvel an). Évitez d'utiliser la fonction de week «simple» car elle vous ramènera une semaine «américaine». N'oubliez pas de set datefirst 1


6 Réponses :


0
votes
SELECT DATEPART(WEEK,GETDATE()-14)
SELECT DATEPART(WEEK,GETDATE()-7)
SELECT DATEPART(WEEK,GETDATE())
SELECT DATEPART(WEEK,GETDATE()+7)
SELECT DATEPART(WEEK,GETDATE()+14)

0 commentaires

2
votes

Utilisez simplement la fonction datepart:

select datepart(week, Date), Date,Time,EndDate,EndTime
FROM Test
WHERE (StartDate >= '01.01.2019')
ORDER BY StartDate


0 commentaires

-2
votes

J'utilise généralement la fonction ROW_NUMBER() pour accomplir ceci:

select 
    Date,
    Time,
    EndDate,
    EndTime, 
    ROW_NUMBER() over (partition by year(EndDate), datepart(weekday, EndDate) order by EndDate) as WeekNumInYear
FROM Test
WHERE 
    (StartDate >= '01.01.2019')
ORDER BY 
    StartDate


4 commentaires

L'avantage d'utiliser ROW_NUMBER est que vous pouvez adapter la requête pour travailler à partir d'une table de périodes fiscales au lieu de simplement des dates calendaires.


Ceci est une erreur. Vous devez utiliser datepart (semaine, date de fin) pour cela. Voir la démo ici


Ce n'est pas incorrect - la «partition par année» garantit que les semaines sont correctement numérotées dans chaque année, si vous avez une table de calendrier de plus d'un an. L'utilisation de row_number () avec "datepart (week-end, EndDate)" fonctionne très bien sur SQL Server. Je proposais simplement une manière différente qui peut également être facilement adaptée aux exercices qui ne correspondent pas exactement aux années civiles (4-4-5).


Eh bien, votre première ligne doit être un dimanche, sinon le regroupement est désactivé ... non? Voir la démo liée.



1
votes

utiliser datepart(wk,date) : -

select Date,Time,EndDate,EndTime,datepart(wk,date)as week
FROM Test
WHERE (StartDate >= '01.01.2019')
ORDER BY StartDate


1 commentaires

Je prendrais l'habitude de ne pas utiliser de sténographie avec les fonctions de date / heure . Je pense que cela se révélera mieux pour vous à long terme :)



1
votes

Au Royaume-Uni, la semaine ISO est utilisée: la semaine de la première année est celle du 4 janvier.

Donc:

week_and_year = case when datepart(iso_week,date)>=52 and month(date)=1 
                           then concat(year(date)-1,datepart(iso_week,date))
                      when datepart(iso_week,date)=1 and month(date)=12
                           then concat(year(date)+1,datepart(iso_week,date))
                      else concat(year(date),datepart(iso_week,date))
                      end

N'oubliez pas que les premiers jours de janvier peuvent être la 52e ou la 53e semaine de l'année précédente et que le dernier jour de décembre peut également appartenir à la première semaine du nouvel an.

le contrôle pour voir le numéro de la semaine et reporté à l'année à laquelle il appartient est le suivant:

set datefirst 1 --this sets Monday as first day of the week 
set dateformat dmy -- nosrmal date format
select Date,Time,EndDate,EndTime,datepart(iso_week,date)as week
FROM Test
WHERE (StartDate >= '01.01.2019')
ORDER BY StartDate


0 commentaires

0
votes

Si vous utilisez Vertica, essayez ceci

 date_part('ISODOW', date) 

'ISODOW' - Le jour ISO de la semaine, un entier entre 1 et 7 où lundi vaut 1.


0 commentaires