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

SAS Base Discussion :

Date à insérer dans une requête sql


Sujet :

SAS Base

  1. #1
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut Date à insérer dans une requête sql
    Bonjour à tous.

    J'ai un petit soucis, je dois entrer, dans une base Oracle, des variables
    au format timestamp suivant :
    23/01/08 11:10:13,000000000

    En entrée, j'ai les données dans ce format :
    2008-01-23 11:10:13

    Sachant que je ne travaille qu'avec des macro fonctions, et que je n'utilise pas de data step, que je ne maîtrise pas du tout, je voudrais savoir comment créer une macro qui transforme l'un en l'autre...

    J'avais pensé à utiliser le format suivant : DDMMYYD10. mais en fait, l'année n'est pas à la fin de la date...


    Une suggestion ?

  2. #2
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Autrement dit, comment transformer une variable contenant : 23-01-2008
    avec une autre variable contenant l'heure (11:10:13), vers un timestamp du style : 23/01/08 11:10:13,000000000 ?

  3. #3
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Essaie avec le format DATETIME27.9

    en entrée ta date est en caractère ou est déja en date SAS ?

    tes 2 variables sont en caractère ou numérique ???

  4. #4
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Tout est en caractère.

  5. #5
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Dans cette étape data je transforme une date 2008-01-23 11:10:13 (chaine de caractère) en une autre chaine de caractère 23/01/08 11:10:13,000000000
    Je ne sais pas si il y a un format adapté pour éviter l'étape data.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    data t1;
    u="2008-01-23 11:10:13";
    format d ddmmyy8.;
    d= input(substr(u,1,10),YYMMDD10.);
    d_chaine=compress(put(d,ddmmyy8.));
    t_chaine=compress(substr(u,11,9));
    new=compress(d_chaine)||' '||compress(t_chaine)||',000000000';
    run;

  6. #6
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Oui, ça marche bien.

    En revanche, impossible de l'intégrer dans une requête sql oracle du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into sample (id_sample,creation_date) values (25000,to_date('27/10/2008','dd/mm/yyyy'));

    En rajoutant ceci : call symput ('creation_date', new);

    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
    data _null_;
    	u="2008-01-23 11:10:13";
    	format d ddmmyy8.;
    	d= input(substr(u,1,10),YYMMDD10.);
    	d_chaine=compress(put(d,ddmmyy8.));
    	t_chaine=compress(substr(u,11,9));
    	new=compress(d_chaine)||' '||compress(t_chaine);
    	call symput ('creation_date', new);
    run;
     
    proc sql;
    	create table work.test (date date);
    quit;
     
    proc sql;
    	insert into test (date) values (&creation_date);
    quit;

    J'ai l'erreur suivante :
    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
    15         proc sql;
    16         insert into test (date) values (&creation_date);
    SYMBOLGEN:  Macro variable CREATION_DATE resolves to 23/01/08 11:10:13           
    NOTE: Line generated by the macro variable "CREATION_DATE".
    16         23/01/08 11:10:13
                 _
                 22
                 76
    ERROR 22-322: Syntax error, expecting one of the following: a quoted string, a numeric constant, a datetime constant, 
                  a missing value, ), +, ',', -, MISSING, NULL, USER.  
    
    ERROR 76-322: Syntax error, statement will be ignored.
    
    NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
    17         quit;
    NOTE: The SAS System stopped processing this step because of errors.
    NOTE: PROCEDURE SQL used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
          
    18
    Bon, je n'en fais pas une priorité ce problème, je vais laisser tomber le champ date. Ne vous embêtez pas avec ça si vous n'avez pas de temps à perdre, mais juste pour l'information et pour m'endormir moins bête, si quelqu'un sait comment faire, merci de préciser.

    Bonne journée.

  7. #7
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    call symput ('creation_date', new);

    La macro variable creation_date contient un chaine caractère que tu insère dans un champ date!!!

    Il faut que tu essayes d'insèrer cette macro variable dans une table de la base oracle (colonne de type timestamp) pour voir si cela marche

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Essaie l'instruction SQL de genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sql;
    	insert into test (date) values (to_date('&creation_date.','dd/mm/yyyy'));
    quit;
    Avec un bon format, bien sur.

    Une variable macro est remplacée tout bêtement par la chaîne de caractères de sa valeur. I.e. dans ton exemple tu exécute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sql;
    	insert into test (date) values (23/01/08 11:10:13);
    quit;
    Tu vois, qu'il manque des quotes et la conversion entre la chaîne de charactères et la date.

  9. #9
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Vi.

    J'ai testé ce que tu as suggéré, mais sans succès.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    OPTIONS MLOGIC MPRINT SYMBOLGEN;
     
    Libname TEST ORACLE schema=TEST_ path=TEST USER='user' PASSWORD='pswd';
     
    %let creation_date = 21/12/2008;
     
    proc sql;
    	execute (insert into test.table (creation_date) values (to_date('&creation_date.','dd/mm/yyyy'))) by Oracle;
    quit;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    14         proc sql;
    15         	execute (insert into test.table (creation_date) values
    15       ! (to_date('&creation_date.','dd/mm/yyyy'))) by Oracle;
    ERROR: ORACLE connection error: ORA-12560: TNS:protocol adapter error.
    NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
    16         quit;
    NOTE: The SAS System stopped processing this step because of errors.
    NOTE: PROCEDURE SQL used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds
    J'ai rien trouvé de concluant sur cette erreur...

    Pourtant j'arrive à insérer d'autres choses sans soucis.

  10. #10
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    C'est un problème de type.
    Comme sur SAS il faut connaitre le format des dates, comment construire une date oracle à partir de SAS.

  11. #11
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    L'erreur n'est pas liée à la date (est ce que tu peux faire la même chose en insérant une chaîne de caractère?)
    http://forums.oracle.com/forums/thre...74240&tstart=0
    http://www.developpez.net/forums/arc.../t-109657.html

  12. #12
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Je dirais que ORA-12560 - c'est plutôt un problème de connexion. Question débile, mais tu es sûr que login/password sont bons ?

  13. #13
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Oui, login et password sont bons.

    Je peux bien insérer des données dans plusieurs tables de la base.


    L'erreur n'est pas liée à la date (est ce que tu peux faire la même chose en insérant une chaîne de caractère?)
    Euh, dans la même table pour le même champ ? Ca m'étonnerait si c'est pas une date il va envoyer une erreur. En revanche, je peux entrer string et numériques sans soucis dans les autres champs.

  14. #14
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    execute (insert into test.table (creation_date) values
    15       ! (to_date('&creation_date.','dd/mm/yyyy'))) by Oracle;
    Ne faut il pas mettre &creation entre double quote? la macro variable &creation_date n'est pas evaluée

  15. #15
    Membre régulier

    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 104
    Points
    104
    Par défaut
    Si en effet. J'ai remis des double quotes.


    Si je laisse exécuter par Oracle, j'ai toujours la même erreur. Si j'enlève le execute by oracle, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    14         proc sql;
    15         	insert into TEST.sample (creation_date) values ("&creation_date.",'dd/mm/yyyy');
    SYMBOLGEN:  Macro variable CREATION_DATE resolves to 21/12/2008
    ERROR: Column CREATION_DATE cannot be referenced. It has been automatically dropped because its datatype is not supported by this 
           engine.
    NOTE: The following 1 column(s) in TEST.SAMPLE  have been automatically dropped because they have a datatype that is not 
          supported by this engine:
    CREATION_DATE 
    NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
    16         quit;
    NOTE: The SAS System stopped processing this step because of errors.
    NOTE: PROCEDURE SQL used (Total process time):
          real time           0.10 seconds
          cpu time            0.03 seconds

  16. #16
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    comment tu as créé la table sample (le type de la variable creation_date)?

  17. #17
    Membre actif

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Points : 254
    Points
    254
    Par défaut
    Est-ce que tu peux insérer une valeur date sans passer par une macro ?
    C'est-à-dire, si tu exécutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    proc sql;
    insert into TEST.sample (creation_date) values ('21/09/1975', 'dd/mm/yyyy');
    Ca marche ?
    Si oui, met l'option MPRINT et regarde ce que SAS construit pour ton macro.

  18. #18
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Citation Envoyé par green_fr Voir le message
    Est-ce que tu peux insérer une valeur date sans passer par une macro ?
    C'est-à-dire, si tu exécutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    proc sql;
    insert into TEST.sample (creation_date) values ('21/09/1975', 'dd/mm/yyyy');
    Ca marche ?
    Si oui, met l'option MPRINT et regarde ce que SAS construit pour ton macro.

    L'insert est faux syntaxiquement :
    insert into TEST.sample (param1, param2) values (val1,val2);
    values prend deux paramètres ce qui veux dire que table contient deux variables.

  19. #19
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    et avec la fonction to_date d'ORACLE ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO x VALUES (to_date('15/10/2005 16:23:23', 'dd/mm/yyyy hh24:mi:ss'));

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/07/2009, 10h51
  2. Comparer date/heure dans une requête SQL
    Par ach152 dans le forum Débuter
    Réponses: 9
    Dernier message: 13/07/2008, 14h24
  3. Comment insérer la date actuelle dans une requête SQL ?
    Par AMINE07 dans le forum Bases de données
    Réponses: 7
    Dernier message: 15/11/2007, 16h47
  4. [SQL] Comment insérer une variable php dans une requête SQL ?
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/05/2007, 08h47
  5. Constante Date dans une requête SQL
    Par tarbala dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 25/04/2006, 16h24

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