Voici une fonction table qui permet d’obtenir toutes les dates de changement d’heure d’été et d’hiver avec le décalage UTC des années de 1976 à 2100 ou d’une année précise.
CREATE FUNCTION dbo.F_CHANGEMENT_HEURE (@AN INT)
RETURNS @T TABLE (AN SMALLINT, JOUR DATETIME, SAISON VARCHAR(5), DECALAGE_UTC SMALLINT)
AS
BEGIN
DECLARE @DD DATETIME, @AND SMALLINT, @ANF SMALLINT;
SELECT @AND = COALESCE(@AN, 1976), @ANF = COALESCE(@AN, 2100)
WHILE @AND <= @ANF
BEGIN
-- passage à l'heure d'été, le dernier dimanche de mars à 1h
SET @DD = CAST(CAST(@AND AS CHAR(4)) + '0331 00:01' AS DATETIME);
WHILE DATEPART(weekday, @DD) <> 7
SET @DD = DATEADD(day, -1, @DD);
INSERT INTO @T VALUES (@AND, @DD, 'Été', +2);
IF @AND < 1996
BEGIN
-- passage à l'heure d'été, le dernier dimanche de septembre à 1h
SET @DD = CAST(CAST(@AND AS CHAR(4)) + '0930 00:01' AS DATETIME);
WHILE DATEPART(weekday, @DD) <> 7
SET @DD = DATEADD(day, -1, @DD);
INSERT INTO @T VALUES (@AND, @DD, 'Hiver', +2);
END
ELSE
BEGIN
-- passage à l'heure d'hiver, le dernier dimanche d'octobre à 1h
SET @DD = CAST(CAST(@AND AS CHAR(4)) + '1031 00:01' AS DATETIME);
WHILE DATEPART(weekday, @DD) <> 7
SET @DD = DATEADD(day, -1, @DD);
INSERT INTO @T VALUES (@AND, @DD, 'Hiver', +1);
END
SET @AND = @AND + 1;
END
RETURN;
END
GO
Exemple 1 : pour l’année 2012
SELECT * FROM dbo.F_CHANGEMENT_HEURE(2012)
AN JOUR SAISON DECALAGE_UTC
------ ----------------------- ------ ------------
2012 2012-03-25 00:01:00.000 Été 2
2012 2012-10-28 00:01:00.000 Hiver 1
Exemple 2 : pour toutes les années de (1976 à 2100)
SELECT * FROM dbo.F_CHANGEMENT_HEURE(NULL)
AN JOUR SAISON DECALAGE_UTC
------ ----------------------- ------ ------------
1976 1976-03-28 00:01:00.000 Été 2
1976 1976-09-26 00:01:00.000 Hiver 2
1977 1977-03-27 00:01:00.000 Été 2
...
1995 1995-03-26 00:01:00.000 Été 2
1995 1995-09-24 00:01:00.000 Hiver 2
1996 1996-03-31 00:01:00.000 Été 2
1996 1996-10-27 00:01:00.000 Hiver 1
...
2011 2011-03-27 00:01:00.000 Été 2
2011 2011-10-30 00:01:00.000 Hiver 1
2012 2012-03-25 00:01:00.000 Été 2
2012 2012-10-28 00:01:00.000 Hiver 1
...
2100 2100-03-28 00:01:00.000 Été 2
2100 2100-10-31 00:01:00.000 Hiver 1
Limites :
Les horaires d’été et d’hiver on été appliqués en France de 1917 à 1945 puis de nouveau à partir de 1976 suite au choc pétrolier. Actuellement ils sont définit du dernier dimanche de Mars au dernier dimanche d’octobre. Comme me l’a fait remarqué sevyc64, avant 1996 cela se faisait du dernier dimanche de mars au dernier dimanche de septembre.
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
Ha oui, tu as raison. C’est corrigé !
ATTENTION, le calcul est partiellement faux !
Les horaires d’été du dernier dimanche de Mars au dernier dimanche d’octobre ne sont appliqués en France que depuis 1996 (et harmoniser au niveau de l’Europe à ces dates là depuis 1998). Auparavant cela se faisait du dernier dimanche de mars au dernier dimanche de septembre.
Tous les pays d’Europe n’appliquent pas l’horaire d’été, mais ceux qui l’appliquent sont obligés de respecter ces dates-là , amis avec la liberté de choisir 1 ou 2h de décalage par rapport au fuseau horaire.
De nombreux autres pays sont sur un schéma du 2nd dimanche de mars au dernier dimanche d’octobre, d’autres encore (dont les états-unis mais pas tous les états) sont du 2nd dimanche de mars au premier dimanche de novembre.