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

SQL Oracle Discussion :

Date et heure ete/hivers


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut Date et heure ete/hivers
    Bonsoir,

    j’interroge via une requete sql une table contenant une date qui doit être stocké sans tenir compte de l'heure ete/hivers.

    je dois tenir compte du faite que la date correspondant à l'heure associé soit en été ou hivers pour mettre l'heure en été et faire -1.

    je cherche une astuce via SQL pour faire cette opération.

    si quelqu'un a une solution.

    j'ai trouvé une piste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select TO_TIMESTAMP_TZ('2006-01-28T17:21:40.000Z' || tz_offset('Etc/Greenwich'),'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM') AT TIME ZONE 'Europe/Paris' from dual;
    si j'applique cela à ma requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_char(TO_TIMESTAMP_TZ(TBLADEEVENTS1.EVENTSTARTTIME || tz_offset('Etc/Greenwich'),'DD/MM/YYYY" HH24:MI:SS TZR') AT TIME ZONE 'Europe/Paris','HH24:mi') AS EVENTSTARTTIME
    il me renvoi une erreur du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ORA-01861: le littéral ne concorde pas avec le format chaîne de caractères
    01861. 00000 -  "literal does not match format string"
    *Cause:    Literals in the input must be the same length as literals in
               the format string (with the exception of leading whitespace).  If the
               "FX" modifier has been toggled on, the literal must match exactly,
               with no extra whitespace.
    *Action:   Correct the format string to match the literal.
    merci par avance

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je pense qu'il suffit de reconstruire une chaine de caractère à partir de la date qui correspond à la piste que vous aviez trouvée.
    TO_TIMESTAMP_TZ prend un char en 1er paramètre, si vous lui mettez une date il fera une conversion implicite en char :
    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
    SQL> with t as (
      2  select sysdate as d from dual union all
      3  select to_date('31/12/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') from dual
      4  )
      5  select to_char(TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z' ||
      6                                 tz_offset('Etc/Greenwich'),'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
      7                                ) AT TIME ZONE 'Europe/Paris'
      8                ,'hh24:mi') AS EVENTSTARTTIME
      9    from t;
     
    EVENT
    -----
    20:23
    17:52
     
    SQL>
    Sinon pas mal l'astuce

    [edit]
    Ah non en fait ça ne marche pas l'astuce n'est pas suffisamment poussée :
    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
    SQL> with t as (
      2  select sysdate as d from dual union all
      3  select to_date('31/12/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') from dual
      4  )
      5  select d,to_char(TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z' ||
      6                                        tz_offset('Etc/Greenwich'),'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
      7                                   ) AT TIME ZONE 'Europe/Paris'
      8                 ,'hh24:mi') AS EVENTSTARTTIME
      9    from t;
     
    D                   EVENT
    ------------------- -----
    04/09/2013 18:38:43 20:38
    31/12/2012 16:52:33 17:52
     
    SQL>

  3. #3
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Bonjour,

    Merci pour la solution.

    J'ai un peu adapter comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH t AS (
        SELECT sysdate AS d FROM dual union ALL
        SELECT to_date('31/12/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') FROM dual    union ALL
        SELECT to_date('31/05/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') FROM dual
        )
        SELECT d,to_char(TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z'||  tz_offset(SESSIONTIMEZONE) ,'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
                                         ) AT TIME ZONE sessiontimezone
                       ,'hh24:mi') AS EVENTSTARTTIME
          FROM t;
    tz_offset('Etc/Greenwich') devient tz_offset(SESSIONTIMEZONE)
    et
    'Europe/Paris' devient sessiontimezone

    j'ai comme l'impression que c'est bon mais je ne suis pas sur de moi.

    j'ai en resultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    05/09/13	08:20
    31/12/12	15:52
    31/05/12	16:52

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Moi j'obtiens ça :
    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
    SQL> WITH t AS (
      2      SELECT sysdate AS d FROM dual union ALL
      3      SELECT to_date('31/12/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') FROM dual    union ALL
      4      SELECT to_date('31/05/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') FROM dual
      5      )
      6      SELECT d,to_char(TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z'||  tz_offset(SESSIONTIMEZONE) ,'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
      7                                       ) AT TIME ZONE sessiontimezone
      8                     ,'hh24:mi') AS EVENTSTARTTIME
      9        FROM t;
     
    D                   EVENT
    ------------------- -----
    05/09/2013 11:58:38 11:58
    31/12/2012 16:52:33 16:52
    31/05/2012 16:52:33 16:52
     
    SQL>
    Ca n'a pas l'air d'être de convenir, perso je ne me firais pas à du session quelquechose...

    Je pense qu'il faut comparer AT TIME ZONE 'Europe/Paris' par rapport à ETC/GMT-1 et ETC/GMT-2 pour déterminer si on est en été ou hivers.
    Le problème c'est que le fait d'être en heure d'été ou d'hivers lors de l'exécution de la requête impacte AT TIME ZONE.
    Comme on veut comparer les heures, ça n'est globalement pas génant, mais au niveau des bornes, la détection est faussée selon qu'on soit en heure d'été ou d'hivers...

    Mon sysdate passe en décembre dans la 2eme exécution de la requête :
    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
    SQL> with t as (
      2  select sysdate as d from dual union all
      3  select to_date('31/03/2013 01:59:59','dd/mm/yyyy hh24:mi:ss') from dual union all
      4  select to_date('31/03/2013 02:00:01','dd/mm/yyyy hh24:mi:ss') from dual union all
      5  select to_date('31/03/2013 02:59:59','dd/mm/yyyy hh24:mi:ss') from dual union all
      6  select to_date('31/03/2013 03:00:01','dd/mm/yyyy hh24:mi:ss') from dual union all
      7  select to_date('27/10/2013 01:59:59','dd/mm/yyyy hh24:mi:ss') from dual union all
      8  select to_date('27/10/2013 02:00:01','dd/mm/yyyy hh24:mi:ss') from dual union all
      9  select to_date('27/10/2013 02:59:59','dd/mm/yyyy hh24:mi:ss') from dual union all
     10  select to_date('27/10/2013 03:00:01','dd/mm/yyyy hh24:mi:ss') from dual union all
     11  select to_date('31/08/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') from dual union all
     12  select to_date('31/12/2012 16:52:33','dd/mm/yyyy hh24:mi:ss') from dual
     13  ),
     14  test as (
     15  select d,
     16         TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z' ||
     17                         tz_offset('Europe/Paris'),'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
     18                         ) AT TIME ZONE 'Europe/Paris' as Paris,
     19         TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z' ||
     20                         tz_offset('Europe/Paris'),'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
     21                         ) AT TIME ZONE 'ETC/GMT-1' as gmt_1,
     22         TO_TIMESTAMP_TZ(to_char(d,'YYYY-MM-DD')||'T'||to_char(d,'HH24:MI:SS')||'.000Z' ||
     23                         tz_offset('Europe/Paris'),'YYYY-MM-DD"T"HH24:MI:SS.FF3"Z"TZH:TZM'
     24                         ) AT TIME ZONE 'ETC/GMT-2' as gmt_2
     25  from t
     26  )
     27  select t.*,
     28         case when to_char(paris,'hh24') = to_char(gmt_2,'hh24') then 'été'
     29              when to_char(paris,'hh24') = to_char(gmt_1,'hh24') then 'hivers'
     30                                                                 else 'Doh!'
     31          end
     32    from test t;
     
    D                   PARIS                                    GMT_1                                    GMT_2                                    CASEWHE
     
    ------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------
     
    05/09/2013 11:57:31 05/09/13 11:57:31,000000000 EUROPE/PARIS 05/09/13 10:57:31,000000000 ETC/GMT-1    05/09/13 11:57:31,000000000 ETC/GMT-2    été
    31/03/2013 01:59:59 31/03/13 00:59:59,000000000 EUROPE/PARIS 31/03/13 00:59:59,000000000 ETC/GMT-1    31/03/13 01:59:59,000000000 ETC/GMT-2    hivers
    31/03/2013 02:00:01 31/03/13 01:00:01,000000000 EUROPE/PARIS 31/03/13 01:00:01,000000000 ETC/GMT-1    31/03/13 02:00:01,000000000 ETC/GMT-2    hivers
    31/03/2013 02:59:59 31/03/13 01:59:59,000000000 EUROPE/PARIS 31/03/13 01:59:59,000000000 ETC/GMT-1    31/03/13 02:59:59,000000000 ETC/GMT-2    hivers
    31/03/2013 03:00:01 31/03/13 03:00:01,000000000 EUROPE/PARIS 31/03/13 02:00:01,000000000 ETC/GMT-1    31/03/13 03:00:01,000000000 ETC/GMT-2    été
    27/10/2013 01:59:59 27/10/13 01:59:59,000000000 EUROPE/PARIS 27/10/13 00:59:59,000000000 ETC/GMT-1    27/10/13 01:59:59,000000000 ETC/GMT-2    été
    27/10/2013 02:00:01 27/10/13 02:00:01,000000000 EUROPE/PARIS 27/10/13 01:00:01,000000000 ETC/GMT-1    27/10/13 02:00:01,000000000 ETC/GMT-2    été
    27/10/2013 02:59:59 27/10/13 02:59:59,000000000 EUROPE/PARIS 27/10/13 01:59:59,000000000 ETC/GMT-1    27/10/13 02:59:59,000000000 ETC/GMT-2    été
    27/10/2013 03:00:01 27/10/13 02:00:01,000000000 EUROPE/PARIS 27/10/13 02:00:01,000000000 ETC/GMT-1    27/10/13 03:00:01,000000000 ETC/GMT-2    hivers
    31/08/2012 16:52:33 31/08/12 16:52:33,000000000 EUROPE/PARIS 31/08/12 15:52:33,000000000 ETC/GMT-1    31/08/12 16:52:33,000000000 ETC/GMT-2    été
    31/12/2012 16:52:33 31/12/12 15:52:33,000000000 EUROPE/PARIS 31/12/12 15:52:33,000000000 ETC/GMT-1    31/12/12 16:52:33,000000000 ETC/GMT-2    hivers
     
    11 rows selected.
     
    SQL> /
     
    D                   PARIS                                    GMT_1                                    GMT_2                                    CASEWHE
     
    ------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------
     
    05/12/2013 11:57:58 05/12/13 11:57:58,000000000 EUROPE/PARIS 05/12/13 11:57:58,000000000 ETC/GMT-1    05/12/13 12:57:58,000000000 ETC/GMT-2    hivers
    31/03/2013 01:59:59 31/03/13 01:59:59,000000000 EUROPE/PARIS 31/03/13 01:59:59,000000000 ETC/GMT-1    31/03/13 02:59:59,000000000 ETC/GMT-2    hivers
    31/03/2013 02:00:01 31/03/13 03:00:01,000000000 EUROPE/PARIS 31/03/13 02:00:01,000000000 ETC/GMT-1    31/03/13 03:00:01,000000000 ETC/GMT-2    été
    31/03/2013 02:59:59 31/03/13 03:59:59,000000000 EUROPE/PARIS 31/03/13 02:59:59,000000000 ETC/GMT-1    31/03/13 03:59:59,000000000 ETC/GMT-2    été
    31/03/2013 03:00:01 31/03/13 04:00:01,000000000 EUROPE/PARIS 31/03/13 03:00:01,000000000 ETC/GMT-1    31/03/13 04:00:01,000000000 ETC/GMT-2    été
    27/10/2013 01:59:59 27/10/13 02:59:59,000000000 EUROPE/PARIS 27/10/13 01:59:59,000000000 ETC/GMT-1    27/10/13 02:59:59,000000000 ETC/GMT-2    été
    27/10/2013 02:00:01 27/10/13 02:00:01,000000000 EUROPE/PARIS 27/10/13 02:00:01,000000000 ETC/GMT-1    27/10/13 03:00:01,000000000 ETC/GMT-2    hivers
    27/10/2013 02:59:59 27/10/13 02:59:59,000000000 EUROPE/PARIS 27/10/13 02:59:59,000000000 ETC/GMT-1    27/10/13 03:59:59,000000000 ETC/GMT-2    hivers
    27/10/2013 03:00:01 27/10/13 03:00:01,000000000 EUROPE/PARIS 27/10/13 03:00:01,000000000 ETC/GMT-1    27/10/13 04:00:01,000000000 ETC/GMT-2    hivers
    31/08/2012 16:52:33 31/08/12 17:52:33,000000000 EUROPE/PARIS 31/08/12 16:52:33,000000000 ETC/GMT-1    31/08/12 17:52:33,000000000 ETC/GMT-2    été
    31/12/2012 16:52:33 31/12/12 16:52:33,000000000 EUROPE/PARIS 31/12/12 16:52:33,000000000 ETC/GMT-1    31/12/12 17:52:33,000000000 ETC/GMT-2    hivers
     
    11 rows selected.
     
    SQL>
    Conclusion la comparaison n'est pas valable...
    Mais comme les bornes interviennent dans la nuit du samedi au dimanche, en fonction de vos applications, peut être n'aurez vous pas de données sur les bornes.
    Dans ce cas la comparaison devient "suffisamment acceptable", je vous la propose donc au cas où et vous laisse gérer vos +1 ou -1 en fonction de la détection heure d'été/d'hivers.

    Sinon, il est probablement plus propre de développer une fonction qui renverra été/hivers et gérera la tranche 02:00 03:00 afin d'avoir un résultat consistent dans le temps.

    PS : évidemment je considère que vous êtes dans un contexte exclusivement français.

  5. #5
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Bonsoir,

    Je suis reparti de ton concept. je ne suis pas à l'heure près en faite. La problématique de borne est sans conséquence.

    Je ne ferme pas le ticket de suite si quelqu'un souhaite apporter un complément d'information

    Merci à vous

Discussions similaires

  1. Teste si la date correspond au passage à l'heure d'hiver
    Par hpalpha dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/02/2011, 17h43
  2. [date()] comment avoir l'heure d'hiver
    Par pierrot10 dans le forum Langage
    Réponses: 10
    Dernier message: 14/01/2011, 01h25
  3. Réponses: 2
    Dernier message: 26/10/2008, 07h34
  4. [Date] Décalage au passage à l'heure d'hiver
    Par tatia34 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 06/12/2007, 14h47

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