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 :

to_char et timezone [11g]


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut to_char et timezone
    Bonjour,

    J'ai un souci sur lequel je m'arrache les cheveux.

    J'ai des colonnes qui contiennent des secondes représentant un timestamp unix. C'est à dire le nombre de secondes écouler depuis le 1/1/1970 00:00:00 UTC .

    Pour moi récupérer la date UTC je fais donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select TO_TIMESTAMP_TZ(
                        '01011970 UTC' ,
                        'DDMMYYYY TZR'
                    ) + NUMTODSINTERVAL(
                        (
                            1401058800
                        ),
                        'second'
                    )
       from dual;
    ce qui me donne: 26/05/2014 01:00:00 (en heure UTC)

    Ce pendant quand j'essaye de formater la date, il me reconverti m'a date en UTC. Je m'explique Le timezone actuel est UTC+2 puisqu'on est en France à l'heure d'été. Et bien La BDD considère ma date UTC comme étant une date en UTC+2 et refait une conversion en UTC. En tous cas s'est mon impression.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select to_char(TO_TIMESTAMP_TZ(
                        '01011970 UTC' ,
                        'DDMMYYYY TZR'
                    ) + NUMTODSINTERVAL(
                        (
                            1401058800
                        ),
                        'second'
                    ), 'DD/MM/YYYY hh24:mi:ss TZR')
       from dual;
    Le résultat est:
    25/05/2014 23:00:00 UTC

    Comme je le vois il considère le Timestamp comme étant de l'UTC+2 et refais une conversion en UTC

    Y a t il un moyen pour obtenir ma date formater en UTC c'est à dire 26/05/2014 01:00:00 UTC. Est ce que c'est moi qui fait une erreur.

    J'ai aussi une autre condition, je ne connais pas le timezone de la/les BDD cibles qui sont potentiellement différents

    Il s'agit d'oracle 11g

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Quelqu'un à une idée?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par LeCogiteur Voir le message
    Quelqu'un à une idée?
    Après pas mal d'essais j'ai réussi à trouver une solution que je ne trouve pas forcément belle mais qui fonctionne (je pense)

    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
     
    SELECT
        to_char(
            TO_TIMESTAMP_TZ(
                '01011970 UTC' ,
                'DDMMYYYY TZR'
            ) + NUMTODSINTERVAL(
                (1401058800) ,
                'second'
            ) + NUMTODSINTERVAL(
                EXTRACT( TIMEZONE_HOUR FROM( TO_TIMESTAMP_TZ( '01011970' ,'DDMMYYYY' ) 
                + NUMTODSINTERVAL( 1401058800 ,'second' ) ) ) ,
                'hour'
            ) + NUMTODSINTERVAL(
                EXTRACT( TIMEZONE_MINUTE FROM( TO_TIMESTAMP_TZ( '01011970' ,'DDMMYYYY' ) 
                + NUMTODSINTERVAL( 1401058800 ,'second' ) ) ) ,
                'minute'
            ) ,
            'DD/MM/YYYY hh24:mi:ss TZR'
        )
    FROM
        dual
    ;
    La réponse est bien:

    26/05/2014 01:00:00 UTC

    N'hésitez pas à donner votre avis sur cette solution

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

Discussions similaires

  1. [oracle 9i] to_char sur un number
    Par sygale dans le forum Oracle
    Réponses: 6
    Dernier message: 30/09/2010, 13h17
  2. Équivalent de TO_CHAR en SQL
    Par Ryan Sheckler dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/04/2006, 14h51
  3. to_char(ma_date) spécifier la langue
    Par soazig dans le forum Oracle
    Réponses: 9
    Dernier message: 03/03/2006, 17h53
  4. select to_char(dat_sit,'9999')
    Par melmouj dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/11/2005, 21h40
  5. Probleme avec fct° To_Char
    Par the_edge dans le forum Oracle
    Réponses: 5
    Dernier message: 17/02/2005, 10h45

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