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

PL/SQL Oracle Discussion :

Différence de deux dates


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut Différence de deux dates
    salut,
    je suis nouvelle dans votre forum et j'ai le plaisir d'etre un membre aussi.

    jai un petit souci je veux savoir comment céer une fonction qui peut faire la difference entre deux dates D1 et D2:

    Nombre jour = D2-D1 avec une exeption que c'est le nombre de jour <0...

    merci de votre soutien.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    l'opérateur - fonctionne parfaitement. Ensuite tu peux tester la valeur et faire un RAISE si c'est négatif

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut
    merci jai pu creer la fonction mais il m'envoie un code erreur voici le code de la fonction que jai créer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE FUNCTION calj (nbrj IN number) 
     RETURN number
     IS
       res number;
       d1 date;
       d2 number;
     begin
      nbrj:= d2-d1;
       if nbrj<0 then res:=0 ;
       else res:=1 ;
       end if;
       RETURN res;
     end;
    /
    voila le code d'erreur ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLS-00363: expression 'NBRJ' cannot be used as an assignment target

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est à cause du IN, ton paramètre doit être IN OUT pour pouvoir être affectée.

    Le plus simple étant de supprimer IN

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut
    oui jai fais ce que vous mavais demander jai enlevé le IN et jai mis IN OUT mais il me donne une autre erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE FUNCTION calj (nbrj IN OUT number) 
     RETURN number
     IS
       res number;
       d1 date;
       d2 number;
     begin
       nbrj:= (d2-d1);
       if nbrj<0 then res:=0 ;
       else res:=1 ;
       end if;
       RETURN res;
     end;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLS-00382: expression is of wrong type

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut
    c'est fait
    jai changé le type de la d2 il etait en number et je dois le mettre en Date/

    merci de votre aide

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    J'ai un peu de mal à comprendre ce que fait ta fonction d1 et d2 étant toujours null.
    Par ailleurs je ne vois pas l'intérêt de mettre le paramètre nbj en in...
    Enfin, utiliser des paramètres in out ou out sur une fonction m'a toujours interpelé, une fonction n'étant censé renvoyer qu'une seule valeur...

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Par défaut
    par exemple au cours de l'année on effectue plusieurs operations exemple :d1=01/05/2004 et d2=05/06/2004 je veux calculer le nombre de jour entre ces deux date d'operation et les stocker dans un champs nbrj

  9. #9
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nbrj number
    d1 date;
    d2 number;
    y'a pas comme un problème ?

    1 date - 1 date = 1 nombre de jour
    1 date - 1 nombre de jour = 1 date

    Toi tu as 1 date - 1 nombre => 1 nombre : pas bon

  10. #10
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par nawrass Voir le message
    par exemple au cours de l'année on effectue plusieurs operations exemple :d1=01/05/2004 et d2=05/06/2004 je veux calculer le nombre de jour entre ces deux date d'operation et les stocker dans un champs nbrj
    Dans ce cas je ne vois pas l'intérêt de faire une fonction, tu peux t'en sortir en sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL>  select d1, d2, decode(sign(d1-d2),-1,0,1) res, d1-d2 nbjr from t1;
     
    D1        D2               RES       NBJR
    --------- --------- ---------- ----------
    10-OCT-08 10-OCT-08          1          0
    10-OCT-08 05-SEP-08          1         35
    05-SEP-08 10-OCT-08          0        -35

  11. #11
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Dans ce cas je ne vois pas l'intérêt de faire une fonction, tu peux t'en sortir en sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL>  select d1, d2, decode(sign(d1-d2),-1,0,1) res, d1-d2 nbjr from t1;
     
    D1        D2               RES       NBJR
    --------- --------- ---------- ----------
    10-OCT-08 10-OCT-08          1          0
    10-OCT-08 05-SEP-08          1         35
    05-SEP-08 10-OCT-08          0        -35
    J'étais curieux si "case" est plus vite que "decode/sign". 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
    declare
      vDate date;
    begin
      vDate := to_date ('01.01.2000', 'dd.mm.yyyy');
      for i in (
        SELECT d1, d2, decode(sign(d1-d2),-1,0,1) res, d1-d2 nbjr FROM (
          select vDate d1, vDate - 50000 + level d2
            from dual
            connect by level <= 100000)) loop
        null;
      end loop;
    end;
    /
     
    00:00:00.96
    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
    declare
      vDate date;
    begin
      vDate := to_date ('01.01.2000', 'dd.mm.yyyy');
      for i in (
        SELECT d1, d2, case when d2 > d1 then 0 else 1 end res, d1-d2 nbjr FROM (
          select vDate d1, vDate - 50000 + level d2
            from dual
            connect by level <= 100000)) loop
        null;
      end loop;
    end;
    /
     
    00:00:00.87

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2006, 14h04
  2. Nombre de minutes de différence entre deux dates
    Par Oberown dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/05/2006, 15h41
  3. Différence entre deux dates
    Par Azharis dans le forum Access
    Réponses: 3
    Dernier message: 11/01/2006, 10h58
  4. Différence entre deux dates
    Par pittzz dans le forum Oracle
    Réponses: 5
    Dernier message: 18/07/2005, 12h24
  5. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 09h34

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