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:
6 Réponses :
SELECT DATEPART(WEEK,GETDATE()-14) SELECT DATEPART(WEEK,GETDATE()-7) SELECT DATEPART(WEEK,GETDATE()) SELECT DATEPART(WEEK,GETDATE()+7) SELECT DATEPART(WEEK,GETDATE()+14)
Utilisez simplement la fonction datepart:
select datepart(week, Date), Date,Time,EndDate,EndTime FROM Test WHERE (StartDate >= '01.01.2019') ORDER BY StartDate
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
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.
utiliser datepart(wk,date)
: -
select Date,Time,EndDate,EndTime,datepart(wk,date)as week FROM Test WHERE (StartDate >= '01.01.2019') ORDER BY StartDate
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 :)
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
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.
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 deweek
«simple» car elle vous ramènera une semaine «américaine». N'oubliez pas deset datefirst 1