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

Oracle Discussion :

[8i] résultat inattendu de l'élément HH24 avec TO_DATE


Sujet :

Oracle

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut [8i] résultat inattendu de l'élément HH24 avec TO_DATE
    Bonjour tout le monde,

    Sur une base en 8i, j'ai fait par hasard les tests suivants en sachant pertinamment que, d'après la doc (10g), lorsque l'on spécifie HH24 alors l'heure doit être comprise entre 0 et 23 :

    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
    8i ALEX> select to_date(-1, 'HH24')
      2  from dual;
    select to_date(-1, 'HH24')
                   *
    ERROR à la ligne 1 :
    ORA-01850: hour must be between 0 and 23
     
     
    8i ALEX> select to_date('30/07/06 -1', 'DD/MM/RR HH24')
      2  from dual;
     
    TO_DATE('30/07/06-1
    -------------------
    30/07/2006 01:00:00
     
    1 ligne sélectionnée.
     
    8i ALEX> select to_char( to_date('30/07/06 -1', 'DD/MM/RR HH24') , 'DD/MM/RR HH24')
      2  from dual;
     
    TO_CHAR(TO_
    -----------
    30/07/06 01
     
    1 ligne sélectionnée.
    Je ne peux pas expliquer pourquoi la 2ème instruction :
    - ne génère pas un message d'erreur comme la précédente
    - retourne une heure égale à 1

    Pouvez-vous m'éclairer ?

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    le -1 est sensé faire quoi ?

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    La ponctuation n'est pas stricte, c'est-à-dire que le tiret et l'espace sépare la date de l'heure.

    Pour un contrôle strict, il te faut FX

    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
     
    SQL> select to_date('25 -1','DD HH24') from dual;
     
    TO_DATE('25-1','DDHH
    --------------------
    25-JUL-2006 01:00:00
     
    SQL> select to_date('25 -1','FXDD HH24') from dual;
    select to_date('25 -1','FXDD HH24') from dual
                   *
    ERROR at line 1:
    ORA-01850: hour must be between 0 and 23
     
    SQL> select to_date('25 01','FXDD HH24') from dual;
     
    TO_DATE('2501','FXDD
    --------------------
    25-JUL-2006 01:00:00

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par SheikYerbouti
    le -1 est sensé faire quoi ?
    planter le programme

    Citation Envoyé par laurentschneider
    La ponctuation n'est pas stricte, c'est-à-dire que le tiret et l'espace sépare la date de l'heure
    Ne m'en veuillez pas mais je ne vous suis pas : pourquoi ne retrouve t'on pas ce tiret dans la sortie générée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    8i ALEX> alter session set nls_date_format = 'DD/MM/RRRR HH24:MI:SS';
     
    Session modifiée.
     
    8i ALEX> select to_date('25 -1','DD HH24') from dual;
     
    TO_DATE('25-1','DDH
    -------------------
    25/07/2006 01:00:00
     
    1 ligne sélectionnée.

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    + ou moins donne la même chose. il ajoute toujours le nombre d'heures.

    +24 et -24 génèrent bien l'exception : l'heure doit être comprise entre 0 et 23

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Magnus
    Ne m'en veuillez pas mais je ne vous suis pas : pourquoi ne retrouve t'on pas ce tiret dans la sortie générée
    ce que je veux dire, c'est qu'en entrée, on est assez libre, on peut par exemple avoir to_date('1/1','DD.MM'), mais cela n'a aucune influence sur la représentation interne de la date. En sortie bien sûr, on n'a que ce qu'on demande

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Depuis 6 mois que je travaille sur Oracle, j'ai (toujours eu) pas mal de difficultés à comprendre le 2ème argument que l'on utilise avec TO_DATE pour les conversion DATE en VARCHAR et inversement.

    D'après ce que j'ai compris : avec TO_CHAR, le 1er argument est converti en chaîne de caractères EXACTEMENT selon le masque fourni en 2ème argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    8i ALEX> select to_char( to_date('1+2', 'DD.MM') , 'DD.MM')
      2  from dual;
     
    TO_CH
    -----
    01.02
     
    1 ligne sélectionnée.
    Le "." que l'on a spécifié comme séparateur du jour et du mois est écrit aussi sur la sortie entre le 01 et le 02.
    Jusque là tout me paraît cohérent.

    Cependant, pour moi, le 2ème argument de TO_DATE décrit le format de la date fournie en 1er argument.
    Si c'est le cas alors vraiment je ne comprends pas comment cette instruction peut être cohérente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    8i ALEX> select to_date('1+2','DD.MM')
      2* from dual
     
    TO_DATE('1+2','DD.M
    -------------------
    01/02/2006 00:00:00
     
    1 ligne sélectionnée.
    A quoi sert le "." ?
    Désolé si mes questions vous paraissent très simples mais même les heures que j'ai passées à éplucher ne m'ont jamais autant intriguées que ces derniers tests...

    [EDIT]
    Extrait de la doc - et ce n'est qu'un exemple parmi tant d'autres - les séparateurs entre le 1er et le 2ème argument sont STRICTEMENT IDENTIQUES (les "," ":" ou "." sont aux même endroits)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT TO_DATE(
        'January 15, 1989, 11:00 A.M.',
        'Month dd, YYYY, HH:MI A.M.',
         'NLS_DATE_LANGUAGE = American')
         FROM DUAL;
     
    TO_DATE(
    --------
    89/01/15
    Arghhhhhhhhhhhhhhhhhhhh
    [/EDIT]

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il ne faut pas tout mélanger.
    To_date() restitue une date au format interne Oracle.

    c'est To_Char() qui gère le format d'affichage:

    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
    SQL> SELECT TO_DATE(
      2      'January 15, 1989, 11:00 A.M.',
      3      'Month dd, YYYY, HH:MI A.M.',
      4       'NLS_DATE_LANGUAGE = American')
      5       FROM DUAL;
     
    TO_DATE('J
    ----------
    15/01/1989
     
    SQL> alter session set nls_date_format='Day Month YYYY HH24/MI:SS' ;
     
    Session modifiée.
     
    SQL> SELECT TO_DATE(
      2      'January 15, 1989, 11:00 A.M.',
      3      'Month dd, YYYY, HH:MI A.M.',
      4       'NLS_DATE_LANGUAGE = American')
      5       FROM DUAL;
     
    TO_DATE('JANUARY15,1989,11:00A.M
    --------------------------------
    Dimanche Janvier   1989 11/00:00
     
    SQL>

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par SheikYerbouti
    Il ne faut pas tout mélanger.
    To_date() restitue une date au format interne Oracle.

    c'est To_Char() qui gère le format d'affichage
    Je suis entièrement d'accord et le SEUL problème qu'il me reste est de comprendre à quoi servent les séparateurs que l'on fournit au 2ème argument de TO_DATE ?

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il servent à faire correspondre le format avec la chaine de caratère fournie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    To_Date( '01/01/01', 'DD/MM/YY' )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    To_Date( '01 01 2001', 'DD MM YYYY' )
    etc.

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Magnus
    à quoi servent les séparateurs que l'on fournit au 2ème argument de TO_DATE ?
    à séparer

    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
     
    SCOTT@LSC01> select to_date('0102','DDMM') from dual;
    TO_DATE('
    ---------
    01-FEB-06
     
    SCOTT@LSC01> select to_date('12','DDMM') from dual;
    select to_date('12','DDMM') from dual
                   *
    ERROR at line 1:
    ORA-01840: input value not long enough for date format
     
     
    SCOTT@LSC01> select to_date('1+++2','DD/_/MM') from dual;
    TO_DATE('
    ---------
    01-FEB-06
    lorsque l'on n'employe pas FX dans to_date, le style de séparateur employé dans le second argument n'a effectivement aucune importance

    OK?

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par laurentschneider
    lorsque l'on n'employe pas FX dans to_date, le style de séparateur employé dans le second argument n'a effectivement aucune importance
    Cette phrase constitue la lumière que je recherchais (dans la doc) :

    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
    8i ALEX> select to_date('1+2', 'DD.MM')
      2  from dual;
     
    TO_DATE('1+2','DD.M
    -------------------
    01/02/2006 00:00:00
     
    1 ligne sélectionnée.
     
    8i ALEX> select to_date('1+2', 'FXDD.MM')
      2  from dual;
    select to_date('1+2', 'FXDD.MM')
                   *
    ERROR à la ligne 1 :
    ORA-01862: the numeric value does not match the length of the format item
     
    8i ALEX> select to_date('1+++++++++2', 'DD.MM')
      2  from dual;
    select to_date('1+++++++++2', 'DD.MM')
                   *
    ERROR à la ligne 1 :
    ORA-01858: a non-numeric character was found where a numeric was expected
    Vous remarquerez que, même en l'absence de FX, si les séparateurs ne correspondent pas en nombre (peu importe la "nature") alors une erreur est générée.

    Merci VRAIMENT à tous les 2

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SCOTT@LSC01> select to_date('1+++++++++2', 'DD.MM') from dual;
    select to_date('1+++++++++2', 'DD.MM') from dual
                   *
    ERROR at line 1:
    ORA-01858: a non-numeric character was found where a numeric was expected
     
     
    SCOTT@LSC01> select to_date('1+2', 'DD.............MM') from dual;
    TO_DATE('
    ---------
    01-FEB-06

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ben j'ai poussé mes tests quitte à décoreller le format du 1er et du 2ème argument comme vous me l'avez montré :
    Citation Envoyé par laurentschneider
    to_date('1/1','DD.MM')
    Il me fallait donc savoir comment Oracle gérait un nombre de séparateurs différents entre le 1er et le 2ème argument puisqu'il ne retourne pas (systématiquement) d'erreur lorsque les séparateurs ne sont pas identiques entre le 1er et le 2ème argument (cas où l'élément FX n'existe pas dans le masque du 2ème argument).

    Avec ces explications, mon test paraît plus cohérent maintenant, non ?

    PS : il y a t'il un intérêt à utiliser un masque de format différent entre le 1er et le 2ème argument - hormi la non lisibilité du code - comme vous me l'avez montré ?

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Magnus
    il y a t'il un intérêt à utiliser un masque de format différent entre le 1er et le 2ème argument - hormi la non lisibilité du code - comme vous me l'avez montré ?
    oui, moins de rigueur lorsque le 1er argument est saisi manuellement par l'utilisateur dans l'application.

    fx force aussi l'emploi du 0, ex 01/01 et non 1/1

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

Discussions similaires

  1. [Encodage] test simple avec résultat inattendu
    Par paragoge dans le forum Langage
    Réponses: 4
    Dernier message: 16/05/2010, 12h52
  2. résultats inattendu avec jointure
    Par bmarcellin71 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/09/2009, 18h59
  3. résultat inattendu avec acCmdPrint
    Par stigma dans le forum Access
    Réponses: 3
    Dernier message: 25/03/2006, 22h51
  4. Insertion d'éléments multimédia avec MySQL
    Par maha83 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 15/02/2006, 21h00
  5. Impression d'éléments Statiques avec QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/12/2003, 19h49

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