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 :

Récupérer date et heure de SYSDATE séparément


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Récupérer date et heure de SYSDATE séparément
    Bonjour

    Sur la base de cette requête, qui me renvoie un datetime au format DD/MM/YYYY HH24:MI:SS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select sysdate from dual
    je souhaite dans mon script PL/SQL:
    - récupérer la valeur de sysdate dans une variable de type date
    - instancier deux nouvelles variables de type date, l'une contenant la date uniquement (DD/MM/YYYY), l'autre ne contenant que l'heure (HH24:MI:SS
    ).

    Pour ce faire, voilà ce que j'ai écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	select to_date(to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'),'DD/MM/YYYY HH24:MI:SS') into NOW_TMP from dual;
    	NOW_TMP_DATE:=to_date(to_char(NOW_TMP,'DD/MM/YYYY'),'DD/MM/YYYY');
    	NOW_TMP_HEURE:=to_date(to_char(NOW_TMP,'HH24:MI:SS'),'HH24:MI:SS');	
    	dbms_output.put_line(NOW_TMP); -- renvoie 06/08/08
    	dbms_output.put_line(NOW_TMP_DATE); -- renvoie 06/08/08
    	dbms_output.put_line(NOW_TMP_HEURE); -- renvoie 01/08/08
    Les valeurs obtenues ne sont pas bonnes
    Peut-être que je me complique la vie avec les to_char, to_date mais j'ai tenté des tas de choses et c'est ce qui me paraît le plus logique...

    Merci de votre aide!

    susu39.

  2. #2
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,
    Qu'est-ce que vous voulez faire exactement ?

    Une date est une date : à la limite une date sans heure on pourrait dire que c'est une date avec l'heure à "00:00:00" mais qu'est-ce que vous attendez pour la date avec seulement l'heure ?
    Je penche, donc je suis

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par susu39 Voir le message


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	select to_date(to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'),'DD/MM/YYYY HH24:MI:SS')
    sysdate est l'heure de la base Oracle, et ça te renvoie un format Date, en gros dans ton select si je pige bien tu recupere une date pour la transformer en chaine de caracteres et pour enfin la retransformer en date :s

    Si tu veux recuperer la date et l'heure séparement ya plus simple:

    select TO_CHAR(SYSDATE, 'YYYY-MM-DD') As DATE_YMD, TO_CHAR(SYSDATE, 'HH24:MI:SS') As TIME_HMS
    from DUAL;
    j'espere avoir bien compris tes attentes.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bonjour

    Concrètement, je ne comprends pas pourquoi j'obtiens les résultats suivants:

    Script PL/SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    spool requete.RES;
    set serveroutput on;
    declare
    	DATE_TMP date;
    begin
    	-- Recuperation de la date courante :
    	select sysdate into DATE_TMP from dual;
    	dbms_output.put_line(DATE_TMP); -- affiche 07/07/08
    end;
    .
    /
    spool off;
    exit;
    Sous un éditeur (SQL-View):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select sysdate from dual; -- renvoie 07/08/2008 10:20:30
    Je ne parviens même pas à récupérer sysdate au format de base!

    Que faire?

    susu39

  5. #5
    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
    Vous confondez données et présentation !

    Une date est une date. Toujours avec une précision données (seconde ou même moins en fonction du type précis)

    Après, pour une date, on peut n'afficher que certaines parties

    regardez les fonctions TO_CHAR et TO_DATE ainsi que les variables NLS_DATE_FORMAT (alter session ou export au prompt)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Je pense que j'ai bien compris le fonctionnement de to_char et to_date.L'un permet la conversion date vers chaîne et l'autre chaîne vers date selon un format donné.

    Je voudrais éviter de modifier NLS_DATE_FORMAT car apparemment cela impacterait toutes les dates de la base.

    Dans mon cas, NLS_DATE_FORMAT = 'DD/MM/RR'.

    Mais je ne vois toujours pas pourquoi je ne pourrais pas simplement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare
    date_tmp date;
    begin
    select sysdate into date_tmp from dual;
    insert into matable(col_de_type_date) values (date_tmp);
    end
    sans me prendre une exception du type:

    ORA-01830: Le modèle du format de date se termine avant la conversion de la chaîne d'entrée entière
    ORA-06512: à ligne 166
    Il y a certainement quelquechose d'essentiel que je n'ai pas encore saisi...! Merci de m'éclairer svp!

    susu39.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    NLS_DATE_FORMAT peut être modifié pour la session uniquement via ALTER SESSION

  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
    Citation Envoyé par susu39 Voir le message
    Je pense que j'ai bien compris le fonctionnement de to_char et to_date.L'un permet la conversion date vers chaîne et l'autre chaîne vers date selon un format donné.

    Je voudrais éviter de modifier NLS_DATE_FORMAT car apparemment cela impacterait toutes les dates de la base.

    Dans mon cas, NLS_DATE_FORMAT = 'DD/MM/RR'.

    Mais je ne vois toujours pas pourquoi je ne pourrais pas simplement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare
    date_tmp date;
    begin
    select sysdate into date_tmp from dual;
    insert into matable(col_de_type_date) values (date_tmp);
    end
    sans me prendre une exception du type:



    Il y a certainement quelquechose d'essentiel que je n'ai pas encore saisi...! Merci de m'éclairer svp!

    susu39.
    ça marche très bien :
    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
    SQL> create table matable(col_de_type_date date) ;
     
    Table crÚÚe.
     
    SQL> declare
      2     date_tmp date;
      3  begin
      4     SELECT sysdate INTO date_tmp FROM dual;
      5     INSERT INTO matable(col_de_type_date) VALUES (date_tmp);
      6  end;
      7  /
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
     
    SQL> select * from matable;
     
    COL_DE_T
    --------
    07/08/08

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    En réalité j'avais mal identifié mon problème : mon script plantait à cause d'un test sur une date!
    L'erreur se situait ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if CLOSEDATE_TMP <> '01/01/1900 00:00:00' --CLOSEDATE_TMP étant une date...
    then
    -- traitement --
    end if;
    commit;
    J'ai donc corrigé par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if to_char(CLOSEDATE_TMP,'DD/MM/RRRR HH24:MI:SS') <> '01/01/1900 00:00:00'
    then
    -- traitement --
    end if;
    commit;
    Maintenant tout fonctionne et j'insère mes dates sans me soucier de récupérer uniquement la partie date ou heure, mon programme s'en charge quand il va chercher dans la base.

    Merci pour votre aide!

    susu39.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    et comparer les dates c'était pas mieux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if CLOSEDATE_TMP <> TO_DATE('01/01/1900','DD/MM/YYYY')

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    oui c'est vrai...

    merci!

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

Discussions similaires

  1. Récupérer date et heure
    Par ptitnicois dans le forum Android
    Réponses: 3
    Dernier message: 21/02/2013, 03h21
  2. récupérer date et heure du jour
    Par Elise0251 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/06/2009, 14h52
  3. récupérer date et heure d'une requête
    Par taffMan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/02/2007, 13h55
  4. récupérer la date et heure système
    Par Rnx69 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2005, 15h43
  5. Réponses: 11
    Dernier message: 23/07/2002, 14h33

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