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 :

Erreur(s) de débutant sur Oracle


Sujet :

SQL Oracle

  1. #1
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut Erreur(s) de débutant sur Oracle
    Bonjour à tous,

    étant donné que les différences d'usage sur oracle et autres sgdb ne sont pas encore très clairs pour moi, j'aimerai que l'on m'explique l' (les) erreur(s) que j'ai faite(s) dans cette 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
    SELECT
               V_NG.LIBELLE AS REGION,
               P.CODE_EDP AS Ouvrage,
               TO_CHAR(P.DATE_DEBUT,'DDMMYY') AS DateDébut,
               SUBSTR(CASE WHEN HOUR(P.DATE_DEBUT)=null THEN '0000' ELSE TO_CHAR(P.DATE_DEBUT, 'HH24MI') END, 0, 3) AS HeureDébut,
               TO_CHAR(CASE WHEN HOUR(P.DATE_FIN)=null THEN DateADD(d,-1, P.DATE_FIN) ELSE P.DATE_FIN END,'DDMMYY') AS DateFin,
               SUBSTR(CASE WHEN HOUR(P.DATE_FIN)=null THEN '2400' ELSE TO_CHAR(P.DATE_FIN, 'HH24MI') END, 0, 3) AS HeureFin,
               P.NATURE AS Nature,
               P.VALEUR AS Valeur1,
               P.VALEUR2 AS Valeur2,
               P.CAUSE AS Cause,
               P.COMMENTAIRE AS Description
     
            FROM BASE.TABLE P, TABLE2 EDP, TABLE3 V_NG
            WHERE EDP.REFERENCE = 'REFERENCE'
            AND EDP.DATE_DEBUT = P.DATE_DEBUT_EDP
            AND EDP.CODE_EDP = P.CODE_EDP
            AND V_NG.NUM_REGION = EDP.NUM_REGION
            ORDER BY V_NG.LIBELLE;
    Les normes de rendu exigent que les heures soient rendues sur trois numéros, d'où le substr. il y a aussi la règle qui stipule que si l'heure n'est pas indiquée (null) on doit mettre à 00:0 pour date début et 24:0 pour date fin, et retirer un jour.

    les jointures sont correctes, elles marchent dans d'autres requêtes.

    Merci à tous !

  2. #2
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    C'est un jeu des 7 erreurs ? Si tu as un message d'erreur ça serait gentil de le donner.

    A première vue :
    - "= null" s'écrit "IS NULL"
    - "2400" n'existe pas sous Oracle, on passe de 23:59 à 00:000, mais si votre norme est ainsi pourquoi pas.

    Edit:
    relecture
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  3. #3
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    Merci de ta prompte réponse.

    Le message d'erreur est "je ne connais pas HOUR(date)". Après je bosse sur toad, et l'impression que j'ai c'est que c'est pas le meillleur truc pour chercher son erreur, surtout quand on débute.

    L'histoire des trois chiffres, c'est pas moi qui ait choisi, de toutes façons les dates n'existent dans la table de base que par demi-heure. Donc pas de souci pour les :59 ils ne tomberont jamais.

    Pareil, si je mets '2400' c'est parce que c'est une exigence du client, c'est d'ailleurs pour ça que je le donne sous forme de varchar2() ou que j'utilise des to_char.

    donc le principal souci c'est HOUR(date) qu'il ne semble décidément pas apprécier...

  4. #4
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Hmmm mais pourquoi chercher à faire HOUR(date) alors que tu utilises TO_CHAR(date, 'HH24MI') plus loin qui marche très bien ?

    De plus une date (au sens Oracle) n'aura jamais sa partie heure à null mais à 00:00:00, donc ta gestion du null n'a pas vraiment d'intérêt sous Oracle.

    Donc à ta place je tenterai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTR(TO_CHAR(P.DATE_DEBUT, 'HH24MI'), 0, 3)
    et ça devrait te donner ce que tu cherches, excepté pour le "2400" où tu risques de devoir transformer "0000" en "2400" avec un decode.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  5. #5
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    Bon. En fait j'ai finit par faire un NVL (ce qui est plus simple, finalement).

    Je n'arrive toujours pas à tester juste les heures d'un sysdate.

    Je vais donc résumer ma question :

    dans une table où certaines dates comportent des heures/min renseignées et d'autre où les heures/min sont nulles, quelle est l'expression me permettant de tester la valeur nulle ou non de ces fameuses heures? trouve pas, désolé


    en gros voici mon truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_CHAR(NVL2(TO_CHAR(P.DATE_FIN, 'HH24MI'), P.DATE_FIN, P.DATE_FIN-1),'DDMMYY') AS DateFin,
    qui ne renvoie pas d'erreur mais qui ne fonctionne pas.

  6. #6
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    ha bah j'ai répondu en même temps que toi j'ai pas eu le temps de lire ta réponse. Donc c'est sûr, sur Oracle les heures ne sont JAMAIS JAMAIS à null?

    donc quand c'est comme ça :



    et que l'heure n'est pas rensignée, c'est pas NULL mais 00:00:00 et ils l'écrivent pas juste pour l'estéthique?

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Exactement, c'est juste pour l'esthétique et ça dépend de ton client.

    Voila les 3 cas :
    le 1er c'est le cas simple avec des heures
    le 2e c'est le cas avec pas d'heure (j'ai fait un trunc de sysdate pour enlever les heures)
    le 3e c'est avec le decode qui permet de transformer les "0000" en "2400" pour suivre ta norme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select * from
    (
    select 1 "cas", to_char(sysdate, 'DD/MM/YYYY HH24:MI:SS') , to_char(sysdate, 'HH24MI') from dual
    UNION
    select 2, to_char(trunc(sysdate), 'DD/MM/YYYY HH24:MI:SS') , to_char(trunc(sysdate), 'HH24MI') from dual
    UNION
    select 3, to_char(trunc(sysdate), 'DD/MM/YYYY HH24:MI:SS') , decode(to_char(trunc(sysdate), 'HH24MI'), '0000', '2400', to_char(trunc(sysdate), 'HH24MI')) from dual
    )
    order by "cas"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1	04/02/2010 10:14:17	1014
    2	04/02/2010 00:00:00	0000
    3	04/02/2010 00:00:00	2400
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui c'est ça, c'est pour l'esthétique.

    J'ajouterai que les fonctions HOUR (celle-là vous l'aviez trouvé) et DATEADD n'existent pas chez Oracle.

    Par contre vous pouvez faire les jointures avec la syntaxe ANSI (inner join dans votre cas)

    Je terminerai en vous disant qu'afficher une date au format DDMMYY ne va générer que de la confusion.

    En France on écrit DD/MM/YYYY, la norme ISO utilise YYYY-MM-DD.
    Utilisez une de ces deux représentations.

  9. #9
    Membre actif Avatar de crashtib
    Homme Profil pro
    Support technico-fonctionnel
    Inscrit en
    Avril 2009
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Support technico-fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 221
    Points : 204
    Points
    204
    Par défaut
    impeccable, merci

    par contre fais gaffe il fait peur ton schtroumpf, on dirait que t'es énervé avec tout le monde


    ---------> []


    merci beaucoup pour ton aide

    PS : je suis d'accord avec vous Waldar pour la synthaxe de la date, mais encore une fois, exigence client...

  10. #10
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Bien vu Waldar, tellement l'habitude de travailler avec un autre outil qui fait les dateadd que j'avais zappé cette fonction.

    > crashtib : mets le sujet en résolu et mon schtroumpf te fera risette
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

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

Discussions similaires

  1. [11g] Débutant sur oracle 11g
    Par maguimax dans le forum Oracle
    Réponses: 1
    Dernier message: 09/02/2013, 09h56
  2. Erreur sur Oracle
    Par key81190 dans le forum Oracle
    Réponses: 7
    Dernier message: 18/05/2007, 11h28
  3. [oracle 8i] Erreur 283 et 3113 sur Standby Database
    Par ariesnojf dans le forum Oracle
    Réponses: 5
    Dernier message: 20/09/2006, 17h38
  4. Réponses: 4
    Dernier message: 04/08/2006, 15h47
  5. Réponses: 2
    Dernier message: 04/07/2006, 14h40

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