IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

convertir des heures selon les fuseaux horaires


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 343
    Points : 129
    Points
    129
    Par défaut convertir des heures selon les fuseaux horaires
    Bonjour,

    Je dispose de 2 tables:
    1. La première contient 2 colonnes:
      1. Une colonne zone de type int
      2. Une colonne fuseau de type varchar(5)
    2. La seconde contient 2 colonnes:
      1. Une colonne zone de type int (identique à la 1ère colonne de la première table
      2. Une colonne heure de type datetime

    Ce que je veux faire, c'est convertir n'importe quelle heure de la 2nde table, en CET/CEST (le fuseau horaire de la France).
    Par exemple, en disant pour la zone numéro 1, si le fuseau est WET alors convertir de WET vers CET, si le fuseau est Hong-Kong alors convertir du fuseau HK vers CET, etc.
    (bien sûr si le fuseau est CET alors donner l'horaire tel quel )

    Mon serveur est CET/CEST.

    Dispose t'on de fonctions de conversion d'une heure d'un fuseau horaire vers un autre? J'ai l'impression que non au vu de mes recherches...
    Connaissez-vous d'autres pistes?

    Merci et bonne journée

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Je pense qu'il faut rajouter dans la première table un champ avec un nombre de minutes de décalage par rapport à un point de référence.
    Le fuseau CET/CEST par exemple a un décalage de 0 et chacun des autres fuseau exprime le nombre de minutes de décalage par rapport à la France.

    Lorsqu'on faut une requete on ajouterait donc à la date et l'heure de l'enregistrement de la table 2 le nombre de minutes de décalage d'un fuseau donné.

    Je ne sais pas si j'ai été clair.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 343
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par Delphi-ne Voir le message
    Je pense qu'il faut rajouter dans la première table un champ avec un nombre de minutes de décalage par rapport à un point de référence.
    Le fuseau CET/CEST par exemple a un décalage de 0 et chacun des autres fuseau exprime le nombre de minutes de décalage par rapport à la France.

    Lorsqu'on faut une requete on ajouterait donc à la date et l'heure de l'enregistrement de la table 2 le nombre de minutes de décalage d'un fuseau donné.

    Je ne sais pas si j'ai été clair.
    Merci Delphi-ne

    J'y ai déjà pensé, mais le problème c'est que pour certains fuseaux, ce décalage change dans l'année selon si on est en horaire d'été ou en horaire d'hiver.
    Par exemple, Hong-Kong à 6h de décalage avec la France en été, et 7h en hiver (je ne suis pas sûr des chiffres mais l'idée est là).

    Merci quand même et si quelqu'un a une piste qu'il n'hésite pas!

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Rien n'empêche de disposer de 2 champs Décalage : un hiver et un été.
    Au niveau du Select, en fonction de la date (la colonne Heure de la table 2 est un DateTime) on fait un Case When pour utiliser un ou l'autre.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 852
    Points : 52 992
    Points
    52 992
    Billets dans le blog
    6
    Par défaut
    Il faut ajouter à votre modèle une table des dates de décalage.

    Pour ma part j'utilise le modèle suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    -- ************************************************************************
    -- FUSEAUX HORAIRES ET PASSAGE AUX HORAIRES D'ÉTÉ ET D'HIVER
    -- ************************************************************************
     
    -- création de la table des décalages horaire par rapport au fuseau
    CREATE TABLE T_FUSEAU_FSO
    (FSO_CODE                      CHAR(2) NOT NULL PRIMARY KEY,  
     FSO_NOM_AERO                  CHAR(8) NOT NULL UNIQUE,
     FSO_DESIGNATION_CODE_US       CHAR(4) NOT NULL UNIQUE, 
     FSO_DESIGNATION_LIBELLE_US    VARCHAR(64), 
     FSO_DESIGNATION_CODE_FR       CHAR(4) , 
     FSO_DESIGNATION_LIBELLE_FR    VARCHAR(64), 
     FSO_DECALAGE_UTC              SMALLINT NOT NULL 
                                   CHECK (FSO_DECALAGE_UTC BETWEEN -12 
                                                               AND  12));
    GO
     
    -- insertion des fuseaux européens
    INSERT INTO T_FUSEAU_FSO 
    VALUES ('Z', 'Zoulou', 'WET', 'Western European Time', NULL, NULL, 0);
    INSERT INTO T_FUSEAU_FSO 
    VALUES ('A', 'Alpha', 'CET', 'Central European Time', 'HNEC', 
            'heure normale de l''Europe centrale', 1);
     
     
    -- table des zones de changement d'horaires
    CREATE TABLE T_ZONE_CHANGE_HEURE_ZCH
    (ZCH_ID                       SMALLINT IDENTITY NOT NULL PRIMARY KEY,
     ZCH_REGION                   VARCHAR(64) NOT NULL);
    GO
     
    -- insertion des données de changement d'horaire
    SET IDENTITY_INSERT T_ZONE_CHANGE_HEURE_ZCH ON;
    INSERT INTO T_ZONE_CHANGE_HEURE_ZCH (ZCH_ID, ZCH_REGION)
           VALUES (1, 'CEE : Communauté Économique Européenne');
    SET IDENTITY_INSERT T_ZONE_CHANGE_HEURE_ZCH OFF;
     
    -- table des dates des changements d'horaire
    CREATE TABLE T_CHANGE_HEURE_DATE_AN_CHD 
    (CHD_AN                       SMALLINT NOT NULL,
     ZCH_ID                       SMALLINT NOT NULL 
                 FOREIGN KEY 
                 REFERENCES T_ZONE_CHANGE_HEURE_ZCH (ZCH_ID),
     CHD_DATEHEURE_CHANGE_ETE     DATETIME,
     CHD_DATEHEURE_CHANGE_HIVER   DATETIME,
     CHD_DECALAGE_ETE             SMALLINT);
    GO
     
    -- insertion des données des changements d'horaire pour 
    -- la zone europe de 2001 jusqu'en 2020
    DECLARE @AN SMALLINT, @DD DATETIME, @DF DATETIME;
    SET @AN = 2001;
    SET DATEFIRST 1;
    WHILE @AN < 2020
    BEGIN 
    -- passage à l'heure d'été, le dernier dimanche de mars à 1h
       SET @DD = CAST(CAST(@AN AS CHAR(4)) + '0331 00:01' AS DATETIME);
       WHILE DATEPART(weekday, @DD) <> 7
          SET @DD = DATEADD(day, -1, @DD);
    -- passage à l'heure d'hiver, le dernier dimanche d'octobre à 1h
       SET @DF = CAST(CAST(@AN AS CHAR(4)) + '1031 00:01' AS DATETIME);
       WHILE DATEPART(weekday, @DF) <> 7
          SET @DF = DATEADD(day, -1, @DF);
       INSERT INTO T_CHANGE_HEURE_DATE_AN_CHD VALUES (@AN, 1, @DD, @DF, 1);
       SET @AN = @AN + 1;
    END
    GO
     
    -- création de la table des zones des fuseaux horaires
    CREATE TABLE T_ZONE_FUSEAU_ZFS
    (ZFS_ID          INT NOT NULL IDENTITY PRIMARY KEY,    
     ZFS_NOM         VARCHAR(128) NOT NULL,
     FSO_CODE        CHAR(2) NOT NULL 
                     FOREIGN KEY REFERENCES T_FUSEAU_FSO (FSO_CODE),
     ZCH_ID          SMALLINT NOT NULL 
                     FOREIGN KEY REFERENCES T_ZONE_CHANGE_HEURE_ZCH (ZCH_ID));
    GO
     
    SET IDENTITY_INSERT T_ZONE_FUSEAU_ZFS ON;
    -- insertion des zones géographiques et leur dépendance au fuseau horaire
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (1, 'Royaume-Uni', 'Z', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (2, 'Irlande', 'Z', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (3, 'Portugal', 'Z', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (4, 'Allemagne', 'A', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (5, 'Autriche', 'A', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (6, 'Belgique', 'A', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (7, 'Espagne', 'A', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (8, 'Italie', 'A', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (9, 'Pays-Bas', 'A', 1);
    INSERT INTO T_ZONE_FUSEAU_ZFS (ZFS_ID, ZFS_NOM, FSO_CODE, ZCH_ID) 
    VALUES (10, 'Suisse', 'A', 1);
    --...
    SET IDENTITY_INSERT T_ZONE_FUSEAU_ZFS OFF;
    GO
    A +

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 343
    Points : 129
    Points
    129
    Par défaut
    Merci à tous les 2...

    Effectivement, Delphi-ne, je peux disposer de 2 colonnes, une pour l'heure d'été et l'autre pour l'heure d'hiver, mais dans ce cas comment savoir si ma date est en été ou en hiver... (à part faire une autre table des changements d'horaire, comme proposée par SQLpro)

    Votre solution est intéressante, mais je continue à réfléchir pour l'instant!
    (je suis méticuleux...!!)

Discussions similaires

  1. Additionner des heures selon Date et heure
    Par samawati dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/04/2008, 19h47
  2. Totaliser des heures et les convertir
    Par pedrolahn dans le forum IHM
    Réponses: 8
    Dernier message: 11/04/2008, 15h38
  3. Réponses: 1
    Dernier message: 24/05/2007, 09h55
  4. [Dates] Convertir des heures en jours/heures?
    Par Kinoh dans le forum Langage
    Réponses: 2
    Dernier message: 20/05/2007, 19h47
  5. Convertir des données selon un charset defini
    Par localhost dans le forum Langage
    Réponses: 1
    Dernier message: 14/03/2006, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo