2017-07-11 4 views
1

So habe ich ein ziemlich interessantes Problem. Ich versuche, ein aktuelles Datum in bestimmte Formate und Stile einzufügen, aber aus irgendeinem Grund scheint es zu scheitern. Ich weiß, es ist kein Formatierungsproblem ... Aber idk, wie man es repariert. eine Datenschrittlösung ist ebenfalls willkommen ... Folgendes funktioniert.SAS einfügen Wert mit proc sql

proc sql; 
create table work.test 
(test_Id char(50), test_Name char(50), cur_Mo char(1), cur_Qtr char(1), entered_Date char(8)); 
insert into work.test 
values('201703','2017 Mar','0','0','24APR17') 
values('201704','2017 Apr','0','0','24APR17') 
values('201706','2017 Jun','1','0','23JUN17'); 
quit; 

Hier ist, was nicht:

proc sql; 
    insert into work.test 
    values(catx('',put(year(today()),4.),case when month(today())< 10 then catx('','0',put(month(today()),2.)) else put(month(today()),2.)end) ,catx(' ',[put(year(today()),4.),put(today(),monname3.))],'1','0',put(today(),date7.)); 
quit; 
+0

Sie können keine Funktionen in eine VALUES-Klausel einfügen. Nur tatsächliche Werte. – Tom

+0

Ich dachte, das wäre der Fall, gibt es einen anderen Ansatz? –

Antwort

2

Sie können die% SYSFUNC() verwenden, Makro-Funktion die meisten anderen SAS-Funktion in Makro-Code aufzurufen. So generiert die heutige Datum in DATE7 Format könnten Sie:

insert into work.test (date) 
    values("%sysfunc(date(),date7)") 
; 
+0

Das ist ein guter Anfang, ich werde versuchen zu sehen, wohin es geht! Danke –

+0

Ich habe eine Follow-up - wie kombiniere ich den Monat und das Datum, so dass es folgt: 201701,201702 und so weiter? –

+0

SAS hat viele Formate für Daten. YYMMN6 würde Datumszeichenfolgen im Format YYYYMM generieren. – Tom

1

Die Art, wie ich wohl tun würde, es ist ein Datum Schritt zu verwenden, einen Datensatz zu machen, die Sie sich einsetzen, und dann diese Daten-Set ein.

Sie können die Syntax insert into (...) select (...) from (...) in SAS verwenden, und der Datenschritt ist viel flexibler, als dass Sie Spalten definieren können.

Zum Beispiel:

proc sql; 
    create table class like sashelp.class; 
quit; 

proc sql; 
    insert into class 
    select * from sashelp.class; 
quit; 

Oder Sie können nur bestimmte Variablen angeben:

proc sql; 
    insert into class (name, age) 
     select name, age from sashelp.class; 
quit; 



data to_insert; 
    name= 'Wilma'; 
    sex = 'F'; 
    age = 29; 
    height = 61.2; 
    weight = 95.3; 
run; 

proc sql; 
    insert into class 
    select * from to_insert; 
quit; 

So stellen Sie sicher, dass Sie entweder explizit die Variablen Liste wählen/einfügen, oder Sie haben die Reihenfolge genau richtig (es entspricht der Position, wenn Sie * verwenden, wie oben beschrieben).

+0

Danke für den Hinweis, was ist, wenn es eine Datumsfunktion als eine der Variablen gab? Ich werde das auch versuchen! Vielen Dank! –

+1

Im Datenschritt ist das kein Problem; Die Datumsfunktion sollte im Datenschritt aufgelöst werden (d. h. den Text "today()" nicht einfügen, aber "age = today() - birthdate;" sollte in Ordnung sein, da die Berechnung im Datenschritt ausgeführt wird. – Joe

+0

Wenn Sie Daten aus einer Tabelle mit einem 'SELECT' anstelle von Konstanten mit' VALUES' einfügen, können Sie Funktionen verwenden. – Tom