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 :

Conversion d'un Timestamp Unix en date Oracle


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 5
    Par défaut Conversion d'un Timestamp Unix en date Oracle
    Bonjour,

    J'ai dans une base Oracle des timestamp issus de serveur UNIX.

    Par exemple j'ai la valeur 1340812868 stockée dans un number(20).

    Le site me dit que ce timestamp correspond à la date "27/06/2012 à 18:01:08".

    Le timestamp Unix est stocké sans le time zone, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select to_date('01/01/1970','DD/MM/YYYY') + 1340812868/3600/24 from dual
    => me donne donc "27/06/2012 à 16:01:08" étant donné qu'il y a actuellement 2h00 de décalage.

    Mon problème est qu'avec le changement d'horaire annuel, je n'arrive pas, quelle que soit les fonctions Oracle que j'utilise à savoir si le décalage est de 1h00 ou 2h00 selon la date ?...
    Je crois avoir tout essayé sans pouvoir trouver de solution .

    Quelqu'un a-t-il déjà été confronté au problème ?

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    J'ai déjà eu le problème, pas sous Oracle mais sur SqlServer, donc vu que c'était non critique et uniquement pour des alertes Nagios, j'ai rajouté 2h tout le temps.

    Je pense que tu vas devoir créer une fonction qui te donne la période de l'heure trouvée (heure été ou hiver), vu que la règle est :


    le passage à l'heure d'été intervient le dernier dimanche de mars à 2 heures du matin et le passage à l'heure d'hiver intervient le dernier dimanche d'octobre à 3 heures du matin.

    L'heure d'été a été instituée en France en 1975 suite au choc pétrolier de 1974 avec l' objectif d'effectuer des économies d'énergie en réduisant les besoins d'éclairage.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 5
    Par défaut Oui en effet..
    Merci pour la réponse.
    Oui en effet, je pense que je vais partir sur quelque chose comme ça.

    Comme je fais des chargements massifs de données de plusieurs millions de lignes et qu'il y a des dates un peu partout, j'espérais une fonction directement Oracle, mais ça semble ne pas être géré.

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    C'est ça que vous cherchez ?
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> SELECT cast(to_date('01/01/1970','DD/MM/YYYY') + 1340812868/3600/24 as timestamp with time zone),
      2         cast(to_date('01/01/1970','DD/MM/YYYY') + 1340812868/3600/24 as timestamp)
      3         FROM dual
      4  /
     
    CAST(TO_DATE('01/01/1970','DD/                    CAST(TO_DATE('01/01/1970','DD/
    ------------------------------------------------- -------------------------------------------------
    27/06/12 16:01:08,000000 +02:00                   27/06/12 16:01:08,000000
     
    SQL>

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 5
    Par défaut Oui, mais...
    Oui, merci mnitu. C'est plus ou moins ce que j'avais exploré, mais aujourd'hui le timezone est à +02:00, et oracle n'est pas capable de me donner un timezone à une date différente :

    Je prends la date suivante :
    Le "01/01/2012 à 10:17:00" correspond à un timestamp de : 1325409420.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT cast(to_date('01/01/1970','DD/MM/YYYY') + 1325409420/3600/24 AS timestamp WITH time zone),
               cast(to_date('01/01/1970','DD/MM/YYYY') + 1325409420/3600/24 AS timestamp)
               FROM dual
     
    01/01/2012 09:17:00.000000 +02:00
    01/01/2012 09:17:00.000000
    Oracle, sauf erreur de ma part ne donne pas de fonction pour gérer un time zone à un instant t, il ne connait que le time zone actuel qu'il applique quelle que soit la date.

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Alors, pas certain si c'est ç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
    18
    19
    20
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> With data as (
      2  SELECT from_tz(cast(to_date('01/01/1970','DD/MM/YYYY') + 1325409420/3600/24 AS timestamp),'Europe/Paris') d1,
      3         from_tz(cast(to_date('01/01/1970','DD/MM/YYYY') + 1340812868/3600/24 AS timestamp),'Europe/Paris') d2
      4    FROM dual
      5  )
      6  Select d1, extract(TIMEZONE_HOUR From d1) ds1,
      7         d2, extract(TIMEZONE_HOUR From d2) ds2
      8    From data
      9  /
     
    D1                                                       DS1 D2                                                       DS2
    ------------------------------------------------- ---------- ------------------------------------------------- ----------
    01/01/12 09:17:00,000000 EUROPE/PARIS                      1 27/06/12 16:01:08,000000 EUROPE/PARIS                      2
     
    SQL>

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 5
    Par défaut
    Justement, c'est sur ce genre de requête qui devrait me donner le bon résultat que je me suis le plus arraché les cheve ux..

    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01882: région de fuseau horaire %s introuvable


    Quand je mets des timezones qui m'intéresse (Europe/Paris - Europe/Brussels) j'ai constamment ce message, alors que ça passe avec des timezones qui ne m'intéresse pas.. comme par exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH DATA AS (
        SELECT from_tz(cast(to_date('01/01/1970','DD/MM/YYYY') + 1325409420/3600/24 AS timestamp),'Asia/Istanbul') d1,
               from_tz(cast(to_date('01/01/1970','DD/MM/YYYY') + 1340812868/3600/24 AS timestamp),'Asia/Istanbul') d2
          FROM dual
        )
        SELECT d1, extract(TIMEZONE_HOUR FROM d1) ds1,
               d2, extract(TIMEZONE_HOUR FROM d2) ds2
          FROM DATA
    J'y comprends rien.. Un bug Oracle ?
    Je suis en Oracle 10.2.0.5.0 - 64 bits.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2012
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 5
    Par défaut
    Comme ça fait plusieurs fois que je bute sur ce problème de Time Zone et que :

    Depuis 1998, les changements d’heure s’effectuent donc au même moment dans tous les pays de l'Union Européenne....

    J'ai donc simplement rajouté une heure au time zone du Dublin.

    Pour ceux à qui ça pourrait servir (colonne ds3) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH DATA AS (
        SELECT from_tz(cast(to_date('01/01/1970','DD/MM/YYYY') + 1325409420/3600/24 AS timestamp),'Europe/Dublin') d1,
               from_tz(cast(to_date('01/01/1970','DD/MM/YYYY') + 1340812868/3600/24 AS timestamp),'Europe/Dublin') d2
          FROM dual
        )
        SELECT d1, extract(TIMEZONE_HOUR FROM d1)+1 ds1, 
               d2, extract(TIMEZONE_HOUR FROM d2)+1 ds2,
               d1 + (extract(TIMEZONE_HOUR FROM d1)+1)/24 ds3
          FROM DATA
    Merci beaucoup, je passe le sujet en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transformation de date Oracle en timestamp
    Par Victa dans le forum SQL
    Réponses: 4
    Dernier message: 04/10/2009, 03h37
  2. Réponses: 5
    Dernier message: 28/08/2009, 18h42
  3. Choix du format de date timestamp Mysql ou timestamp Unix
    Par audreyc dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/04/2009, 07h20
  4. probleme de conversion d'un timestamp en date
    Par mimaaaa dans le forum JSF
    Réponses: 8
    Dernier message: 27/10/2008, 18h49
  5. Formater une date via un timestamp UNIX et un modèle modifiable
    Par Aldéhir dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 7
    Dernier message: 11/09/2007, 16h43

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