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 :

fonction to_char appliquée à des dates


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    990
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 990
    Par défaut fonction to_char appliquée à des dates
    Bonjour,

    Par défaut, oracle affiche les dates au format défini dans la variable d'environnement nls_ date_format.

    Mais la fonction to_char permet de convertir ces dates en un autre format de notre choix.
    Je voulais simplement confirmer que cette conversion n'entraîne pas le changement de format par défaut et que dans la base de données les dates sont toujours au format défini dans la variable d'environnement nls_date_format.

    Merci beaucoup de votre aide.

    Cordialement

    Nathalie

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    je te le confirme

  3. #3
    Invité
    Invité(e)
    Par défaut
    Une date est stockée en base sans aucun format associé.
    C'est seulement lors de l'affichage que l'on passe par un format défini par défaut dans la base ou dans la session.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    990
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 990
    Par défaut affichage d'une date au format voulu
    Bonjour,

    Si les données ne sont pas à un certain format dans la bdd, alors à quoi sert de donner un type de données lorsqu'on crée des champs?

    D'après ce que je pense elles sont à un certain format date par défaut tel que défini dans la variable d'environnement nls_date_format et ensuite , si on veut modifier l'affichage en un aiutre format on peut le faire grace à la fonction to_char.

    J'espère ne pas me tromper.

    Cordialement.
    Nathalie

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    La donnée a un type : DATE mais ce n'est pas formater... il faut comprendre que dans la base c'est probablement stocké comme un NUMBER (nombre de jour depuis une date fixée dans le noyau) qui a des propriétés particulières (voir les cours sur la programmation objet ). Le format d'affichage ne dépend donc que du contexte de l'application cliente qui sélectionne la donnée

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    990
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 990
    Par défaut format des données de type date
    Merci de cette explication.J'en avais besoin.
    Pourrais tu juste m'expliquer pourquoi, quand j'insère une donnée de type date dans la base de données, je dois mettre des simples quotes au niveau de la date saisie.
    Pourrais tu également me confirmer que dans la base de données
    les données de type date sont des nombres.
    Merci encore à toi de ton aide.

    Cordialement.
    Nathalie

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    peu importe que ce soit inséré comme un nombre ou une chaine de caractères... t'as juste à savoir que le format (DD/MM/YYYY ou DD-MON-RR ou autre) est appliqué lors du SELECT.

    Sinon, pourquoi des quotes... bah parce qu'il fallait bien trouver un moyen de montrer à la base où commence la date et ou elle se termine, c'est pour ça que la chaîne de caractères de la date est encadrée par des quotes.

    Si tu as d'autres questions métaphysiques n'hésite pas

  8. #8
    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
    Une date est stocké dans la base dans un format de longueur fixe sur 7 octets (bytes); elle contient toujours: siècle, l'année dans le siècle, le mois, le jour du mois, l'heure, le minute et la seconde.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create table t as select sysdate adate from dual
    /
    select adate, dump(adate, 10) from t
     
    ADATE
    --------
    DUMP(ADATE)
    ------------------------------------
    05/11/07
    Typ=12 Len=7: 120,107,11,5,21,43,19
    Le siècle et l'année sont stockée en notation en excès 100, cella veut dire qu'il faut extraire 100 pour déterminer la valeur. Le mois et le jour sont stockés sans modification. L'heure le minute et la seconde sont stockés en notation excès 1 (il faut soustraire 1)
    Donc
    120 – 100 = 20
    107 – 100 = 7
    21 – 1 = 20
    43 – 1 = 42
    19 -1 = 18
    Cela fait 05 11 2007, 20 heure 42 minute et 18 seconde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    insert into t values ('06/11/2007');
     
    SQL> select adate from t;
     
    ADATE
    --------
    05/11/07
    06/11/07
    Le simple quotes il faut le mettre parce que ce tu insère est une chaîne de caractère. En fait le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into t values ('06/11/2007');
    devient en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into t values (to_date('06/11/2007'))
    sauf que c'est Oracle qui se charge de faire une conversion implicite chaîne de caractère vers date; mais se baser sur les conversions implicite est toujours mauvais

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    990
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 990
    Par défaut formatage de données type date
    Merci de cette explication,
    Mais si l'insertion est faite comme il se doit au bon format, la conversion implicite n'est pas utile, et les quotes qui entourent la date ne sont pas utiles non plus alors...
    Merci de m'en dire plus à ce propos.
    Cordialement.
    Nathalie

  10. #10
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Qu'est-ce que tu veux savoir exactement ? Parce que là tu t'arrêtes à des concepts tout à fait mineurs d'une importance tout à fait minime

    Pour insérer une date sans conversion t'a pas d'autre moyen qu'utiliser une colonne ou variable de type date... une valeur en dur sera toujours une chaine de caractères

  11. #11
    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
    Commencez par vous dire « une date c’est une date, une date c’est une date, une date c’est une date, une date c’est n’est pas une chaîne de caractères, une chaîne de caractères n’est pas une date ». Répétez-le autant de fois que nécessaire pour que vous voyiez qu’il s’agit bien de deux types de données différentes.
    Après il est simple a voir que les conversions s’applique en entrée/sortie et seulement quand on mélange les dates avec les chaînes de caractères. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select sysdate from dual
    renvoie un type de données date que on peut attribuer à une colonne de type date sans conversion. Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select ’01/01/2007from dual
    renvoie un type de données chaîne de caractères qu'on ne peut pas attribuer à une colonne de type date que si on fait une conversion explicite ou malheureusement implicite.

  12. #12
    Nouveau candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut PB de tri de champs Date/heure enregistrés en GMT
    Bonjour à tous,

    Mon problème concerne un peu ce qui a été expliqué ici (je vous le soumets afin de voir si vous auriez par hasard une solution...) :

    Dans une base Oracle, j'ai une table nommée "Evenement" , lquelle contient 2 champs :
    - date_heure (enregistrée à l'heure GMT)
    - titre (de l'évenement)

    Chaque nouvel évenement est ainsi stocké en heure GMT

    Le problème c'est que lorsque je les appelle, ces champs sont automatiquement traduits en heure locale.

    Cela me pose un probleme de tri le jour du changement d'heure d'hiver vers heure d'été
    -> le 28/10/07 à 3h00 il est 2h00, et donc on passe du GMT+2 au GMT+1 (et il y a donc 2 tranches 2h-3h en heure locale)

    Si j'enregistre dans la base ces 2 évenements :
    Evenement_1 au format GMT : 28/10/07 00:50 Sport
    Evenement_2 au format GMT : 28/10/07 01:15 Musique

    En heure locale ces dates_heures ont ces valeurs
    Evenement_1 au format heure locale : 28/10/07 02:50 Sport
    Evenement_2 au format heure locale : 28/10/07 02:15 Musique

    Note : le changement d'heure a eu lieu entre ces 2 évenements

    et donc lorsque je fais un select * from evenement order by date_heure ASC :

    il me donne les evenement dans le mauvais ordre...
    28/10/07 02:15 Musique
    28/10/07 02:50 Sport

    Comment faire pour que le tri se fasse bien sur l'heure enregistrée en base (GMT) et non retraduite en heure locale ???

    Un grand merci pour votre aide...
    Fred.

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    euh... y'a un truc que je ne saisis pas... en principe, GMT c'est GMT... y'a pas de changement d'heure si ?

    Sinon, pour le tri tu peux ajouter une colonne pour stocker l'ordre d'insertion ou alors ajouter une condition pour ajouter une heure selon la date mais là ça parait un peu compliqué pour pas grand chose

  14. #14
    Nouveau candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Merci pour ta réponse,

    en fait GMT c'est bien une heure fixe, mais "notre" changement d'heure "en heure locale (france)" implique que l'on passe du GMT+2 au GMT+1 tel jour à telle heure (cette année c'est le 28/10/07 à 01h00 GMT)

    Effectivement en base j'ai stocké du GMT et j'aimerais le voir à l'écran !
    le probleme est que tout "select" de date est traduit en heures locales...

    Je ne sais pas comment sortir ce que j'ai vraiment en base, sans que mon client SQL n'interprete la date...?

  15. #15
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est du coté du programme client qu'il faut agir dans ce cas

  16. #16
    Nouveau candidat au Club
    Inscrit en
    Novembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour votre réponse... en fait, j'essaye (pour commencer) de retrouver mes date_heures au format GMT dans un client SQL (via une requete) , mais je n'y arrive pas... C'est toujours transformé en heure locale...

    j'ai même essayé la fonction new_time, mais j'ai toujours du local...

    en gros j'aimerais trouver un moyen d'afficher en SQL dans mon client les date_heure en GMT...

    Si qqun a une idée!? Je le remercie par avance!
    Fred,

  17. #17
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    il me semble que pour se faire il faut que le poste client soit en GMT... peut-être qu'une conversion TIMESTAMP avec un TIMEZONE adéquat ferait l'affaire mais j'avoue que je ne suis pas calé en la matière

    Tiens, voila qui devrait t'intéresser : http://www.developpez.net/forums/sho...d.php?t=422151
    notamment le set time_zone

Discussions similaires

  1. [XL-2007] fonction si avec des dates
    Par mjihanne dans le forum Excel
    Réponses: 6
    Dernier message: 11/09/2020, 12h39
  2. Probleme fonction SumIf avec des dates
    Par Sogestion dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/08/2012, 16h05
  3. Fonction pour comparer des dates en matlab
    Par mihaispr dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/07/2009, 16h40
  4. Obtenir des dates en fonction du n° de la semaine
    Par coeur74 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/02/2005, 13h42
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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