avril
2011
L’option ISO_WEEK pour la fonction DATEPART n’existe pas sous SQL SERVER 2005. Sous SQL SERVER 2008 et > Cette option retourne le numéro de semaine pour une date, telle que définie par la norme ISO 8601.
La norme ISO pour la numérotation des semaines impose que :
–> la semaine numéro 1 d’une année correspond à la semaine où tombe le premier jeudi de l’année.
–> la semaine commence le lundi
Cette norme ISO est conforme aux calendriers actuels utilisés dans la plupart des pays européens et africains (certains africains attachés aux rapports directs avec la nature continuent de prendre comme référence du début du mois, l’apparition du croissant de lune …)
Voyons concrètement le mécanisme de numérotation ISO pour la semaine et son impact sous SQL SERVER
En regardant ce calendrier en ligne : http://www.almanach.free.fr/
Je constate que :
–> Pour l’année 2008, le premier jeudi tombe le 4 janvier 2008 => le lundi 31 décembre 2007 au dimanche 6 janvier 2008 représente la semaine N°1 pour l’année 2008
–> Pour l’année 2009, le premier 1 janvier est un jeudi => le lundi 29 décembre 2008 au dimanche 4 janvier 2009 représente la semaine N°1 pour l’année 2009
–> Pour l’année 2011, le premier jeudi tombe le 6 janvier 2011 => la semaine du lundi 3 au dimanche 9 janvier 2011 représente la semaine N°1 pour l’année 2011
Voyons ce que dit SQL SERVER 2008
SET LANGUAGE Français
GO
SELECT DATEPART(WEEK,'2011-04-08T19:00:00') AS 'WEEK Number'
SELECT DATEPART(ISO_WEEK,'2011-04-08T19:00:00') AS 'ISO_WEEK Number'
–Résultat
WEEK Number
———–
15
ISO_WEEK Number
—————
14
SET LANGUAGE us_english
GO
SELECT DATEPART(WEEK,'2011-04-08T19:00:00') AS 'WEEK Number'
SELECT DATEPART(ISO_WEEK,'2011-04-08T19:00:00') AS 'ISO_WEEK Number'
–Résultat
WEEK Number
———–
15
ISO_WEEK Number
—————
14
Pour agréger des données et présenter des rapports par numéro de semaine sous SQL SERVER 2005, on peut avoir besoin d’écrire la fonction ISO_WEEK pour SQL SERVER 2005 si on a le temps. Pour ma part j’ai récupéré cette fonction sur le site
–============================================================================================
– FONCTION dbo.ISOWeek
———————————————————————————————
– Retourne le numéro de la semaine ISO pour une date donnée (datetime).
– L'option iso_week pour la fonction DATEPART n'est pas supportée par SQL SERVER 2005
– C'est pourquoi il faut la présence de cette fonction pour obtenir les numéros de semaines correctes par rapport notre calendrier.
– Source : http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server
–============================================================================================
CREATE FUNCTION [dbo].[ISOWeek]
(@dtDate as DATETIME)
RETURNS nvarchar(7) WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
DECLARE @intISOWeekdayNumber INT
DECLARE @dtThisThursday DATETIME
DECLARE @dtFirstOfThisThursdaysYear DATETIME
DECLARE @intISOWeekdayNumberOfFirstOfThisThursdaysYear INT
DECLARE @dtFirstThursdayOfYear DATETIME
DECLARE @intISOWeekNumber INT
Declare @intYear Int
– Get the ISO week day number (Monday = 1) for our date.
SET @intISOWeekdayNumber = (((DATEPART(dw, @dtDate) - 1) + (@@DATEFIRST - 1)) % 7) + 1
– Get the date of the Thursday in this ISO week.
SET @dtThisThursday = DATEADD(d,(4 - @intISOWeekdayNumber),@dtDate)
– Get the date of the 1st January for 'this Thursdays' year.
SET @dtFirstOfThisThursdaysYear = CAST(CAST(YEAR(@dtThisThursday) AS CHAR(4)) + '-01-01' AS DATETIME)
SET @intISOWeekdayNumberOfFirstOfThisThursdaysYear = (((DATEPART(dw, @dtFirstOfThisThursdaysYear) - 1) + (@@DATEFIRST - 1)) % 7) + 1
– Get the date of the first Thursday in 'this Thursdays' year.
– The year of which the ISO week is a part is the year of this date.
IF (@intISOWeekdayNumberOfFirstOfThisThursdaysYear in (1,2,3,4))
SET @dtFirstThursdayOfYear = DATEADD(d,(4 - @intISOWeekdayNumberOfFirstOfThisThursdaysYear),@dtFirstOfThisThursdaysYear)
ELSE
SET @dtFirstThursdayOfYear = DATEADD(d,(4 - @intISOWeekdayNumberOfFirstOfThisThursdaysYear + 7),@dtFirstOfThisThursdaysYear)
– Work out how many weeks from the first Thursday to this Thursday.
SET @intISOWeekNumber = DATEDIFF(d,@dtFirstThursdayOfYear,@dtThisThursday)/7+1
if (Datepart(mm,@dtDate)=1 and @intISOWeekNumber > 50)
Set @intYear = Datepart(yyyy,@dtDate)-1
else if (Datepart(mm,@dtDate)=12 and @intISOWeekNumber = 1)
Set @intYear = Datepart(yyyy,@dtDate)+1
else
set @intYear = Datepart(yyyy,@dtDate)
RETURN (cast(@intISOWeekNumber as nvarchar) + '/' + cast(@intYear as nvarchar))
END
GO
————————————————–
Etienne ZINZINDOHOUE
————————————————–