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 :

Addition de date


Sujet :

Oracle

  1. #1
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut Addition de date
    bonjour,

    J'essais d'addionner 1 date et 6 heures

    ma date est au format 01/17/2008 10:27:32
    6 heures correspond à 0.25
    Lorsque j'additionne j'obtiens comme résultat 01/17/2008 4:27:32 mais j'aimerais obtenir le résultat sous la forme 01/17/2008 16:27:32 car j 'aimerai la comparer à une date sous la 01/17/2008 14:27:32 donc elle devient plus petite au lieu d'être plus grande.
    Si quelqu'un à une petite idéé
    merci d'avance
    Cyril

  2. #2
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    regardez du côté de NLS_DATE_FORMAT !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TO_CHAR(TO_DATE('01/17/2008 10:27:32', 'MM/DD/YYYY HH24:MI:SS') + 0.25, 'MM/DD/YYYY HH24:MI:SS') FROM DUAL;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    rbaraer@Ora10g> SELECT TO_CHAR(TO_DATE('01/17/2008 10:27:32', 'MM/DD/YYYY HH24:MI:SS') + 0.25, 'MM/DD/YYYY HH24:MI:SS') FROM DUAL;
     
    TO_CHAR(TO_DATE('01
    -------------------
    01/17/2008 16:27:32
     
    rbaraer@Ora10g>
    L'addition avec une date se fait directement en nombre de jours, donc dans votre cas 0.25. Si la colonne est bien de type DATE pas de problème, il suffit d'y ajouter 0.25, sinon il faut faire un TO_DATE comme ci-dessus.

    Si vous stockez des dates en string, c'est une TRES mauvaise idée pour plein de raisons (perfs des recherches, contrôle de cohérence ie date valide...).

    Cordialement,

    rbaraer

  4. #4
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Merci de vos réponse
    Je suis au format nls_date_format = 'MM/DD/YYYY HH24:MI:SS'

    Pour rbaraer :
    J'ai fait aussi comme tu me l'as indiqué mais le problème s'est en suite.
    Je ne peux pas comparer mon résultat qui est un string avec une date
    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TO_CHAR(DEM_DATE_CREAT + 0.25, 'DD/MM/YYYY HH24:MI:SS') INTO vtempDateDepart FROM DUAL;
    DEM_DATE_CREAT est format date 01/17/2008 10:27:32 mais vtempDateDepartest égale 01/17/2008 4:27:32. Par contre en remplaçant
    DEM_DATE_CREAT par sysdate le format est correct.

    voilà

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    DEM_DATE_CREAT est une DATE (donc pas de format)
    Pourquoi mets-tu vtempDateDepart en CHAR ?

    Il te suffirait de déclarer vtempDateDepart en DATE, et de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vtempDateDepart := DEM_DATE_CREAT + 0.25;
    Pas de SELECT FROM DUAL inutile.
    Ensuite tu fais ta comparaison de date (vtempDateDepart < sysdate)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par cyril Voir le message
    Merci de vos réponse
    Je suis au format nls_date_format = 'MM/DD/YYYY HH24:MI:SS'
    Je crois pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> alter session set NLS_DATE_FORMAT='MM/DD/YYYY HH24:MI:SS';
     
    Session altered.
     
    SQL> select to_date('01/17/2008 10:27:32', 'MM/DD/YYYY HH24:MI:SS') + 0.25 from dual;
     
    TO_DATE('01/17/2008
    -------------------
    01/17/2008 16:27:32

  7. #7
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Je suis au format nls_date_format = 'MM/DD/YYYY HH24:MI:SS'
    Pour MCm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vtempDateDepart := DEM_DATE_CREAT + 0.25;
    Je l'ai effectivement fait comme cela mais vtempDateDepart en date prends la valeur 01/08/2008 2:32:10 au lieu de 14:32:10. Par contre en déclarant vtempDateDepart en varchar cela fonctionne mais ensuite la comparaison entre les dates ne fonctionne plus.
    Pour tant la date DEM_DATE_CREAT est 01/08/2008 10:32:10.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TO_DATE(TO_CHAR(DEM_DATE_CREAT + vNiveauUrgence, 'MM/DD/YYYY HH24:MI:SS') , 'MM/DD/YYYY HH24:MI:SS') INTO vDateDepart FROM DUAL;
    vDateDepart est égale 01/08/2008 2:32:10 et non pas 01/08/2008 14:32:10

    voila toujours au point mort
    merci à tous

  8. #8
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    jouez donc mon jeu d'essai !

    et vous verrez que votre nls_date_format est forcément pas bon

  9. #9
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Pour LeoAnderson
    Je suis bien au format NLS_DATE_FORMAT='MM/DD/YYYY HH24:MI:SS'.
    J'ai aussi alterer la session dans le doute avec le format précedent comme tu l'as dit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT to_date('01/17/2008 10:27:32', 'MM/DD/YYYY HH24:MI:SS') + 0.25 FROM dual;
    Ce code fonctionne, je n'ai pas dis le contraire.
    Je me suis sans doute mal expliqué.
    Je n 'ai pas besoin de faire un To_Date ma variable est une date sous ce format
    MM/DD/YYYY HH24:MI:SS. Quand j'additionne ma variable avec 0.25
    ma date (résultat) se présente sous la forme 01/17/2008 2:27:32 et non 01/17/2008 14:27:32. Ensuite j'ai besoin de comparer cette date à une autre.
    J'ai testé en passant par une variable intermédiaire
    vtempDateDepart en varchar résultat ok, vtempDateDepart est bien égale à 01/17/2008 14:27:32
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select  TO_CHAR(LG_ELMT.DEM_DATE_CREAT + 0.25, 'MM/DD/YYYY HH24:MI:SS') INTO vtempDateDepart from dual;
    comme j'ai besoin au final d'une date
    j'ai converti cette chaine en date et là KO on revient à 01/17/2008 2:27:32 Et je suis bien au format 'MM/DD/YYYY HH24:MI:SS'. De plus toutes les dates de ma base sont bien a ce format.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select  TO_DATE(vtempDateDepart, 'MM/DD/YYYY HH24:MI:SS') INTO vDateDepart from dual;
    En espérant avoir été plus claire
    merci

  10. #10
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    non, désolé, je comprends pas mieux

    donnez-nous un scénario de test (bloc PL/SQL, requete, ...)

  11. #11
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    merci

    le scénario est tout bête
    J'additionne une date au format MM/DD/YYYY HH24:MI:SS à 0.25. J'obtiens un résultat avec une date sous le format MM/DD/YYYY HH:MI:SS.
    01/17/2008 10:27:32 +0.25 = 01/17/2008 2:27:32 au lieu de 01/17/2008 14:27:32.
    Par contre si je fais sysdate +0.25, j'obtiens le bon format de date.

  12. #12
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    C'est donc exactement le scénario que je proposais...

    essayez alors celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    alter session set nls_date_format = 'MM/DD/YYYY HH24:MI:SS';
     
    declare
       ld$date DATE;
       lc$date VARCHAR2(100);
    begin
       ld$date  := to_date('01/17/2008 10:00:00', 'MM/DD/YYYY HH24:MI:SS');
       ld$date  := ld$date + 0.25;
       lc$date := to_char(ld$date)
       dbms_output.put_line(lc$date);
    end;
    /

  13. #13
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    merci à tous

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

Discussions similaires

  1. Addition de dates
    Par 18carats dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/01/2009, 11h12
  2. Addition de date
    Par rxseac dans le forum DB2
    Réponses: 2
    Dernier message: 27/08/2007, 15h08
  3. [CR] pb (concaténation/Conversion/Addition) sur date/heure
    Par marvel dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 20/12/2004, 15h31
  4. Addition de dates
    Par shingo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 19/01/2004, 14h53
  5. [VB6] Problème d'addition de dates et de nombres
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/11/2002, 21h12

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