Umwandlung eines Character-Feldes in einen Timestamp zur Abfrage einer DB2-Tabelle

Hallo Miteinander,

ich stehe ein bißchen auf Kriegsfuß mit Formatumwandlungen.
Ich habe eine DB2-Tabelle, in der ein timestamp vorkommt. Auf diesen will ich eine Abfrage machen. Abhängig vom vorgegebenen Datum soll die Abfrage auf den 1. Kalendertag des Vormonats lauten.
Die Vorarbeiten dazu waren erfolgreich (auch dank Hilfe diese Forums...):

%LET TargetDay = 05AUG2010;
data test;
Datum_AKT = "&TargetDay."d;
Datum_Minus_1Monat = INTNX('MONTH',Datum_AKT,-1);

Tag_timestamp = put(Datum_Minus_1Monat,date9.);
Sel_timestamp = cats (Tag_timestamp , ":00:00:00.000000");
run;

Nun soll der Inhalt des Feldes Sel_timestamp als timestamp für folgende Abfrage verwendet werden:

PROC SQL NOPRINT STIMER;
CREATE TABLE WORK.Tabelle2 AS
SELECT Feld1
,FELD2
FROM DB2BAS.TABELLE1

WHERE POSTEINGANGNR >= '05AUG2010:00:00:00.000000'dt

;

QUIT;

Wie bekomme ich das nun hin?????

Vielen Dank für Eure Hilfe!
Gruß,
Karin

Lösung mittels Makrovariable

Hallo Karin,

eine Möglichkeit sieht so aus:

%LET TargetDay = 05AUG2010;

data _null_; * Falls das Dataset test nicht unbedingt benötigt wird, kann so Datenmüll vermieden werden.;
Datum_AKT = "&TargetDay."d;
Datum_Minus_1Monat = INTNX('MONTH',Datum_AKT,-1);

Tag_timestamp = put(Datum_Minus_1Monat,date9.);
Sel_timestamp = cats(Tag_timestamp , ":00:00:00.000000");
call symput ("timestamp",strip(Sel_timestamp)); * Anlegen der Makrovariablen timestamp;
run;

%put timestamp: ~&timestamp.~; * Ausgabe ins Log zur Kontrolle;

PROC SQL NOPRINT STIMER;
CREATE TABLE WORK.Tabelle2 AS
SELECT Feld1
,FELD2
FROM DB2BAS.TABELLE1
WHERE POSTEINGANGNR >= "&timestamp."dt /* Verwendung des Zeitstempels */
;
QUIT;

Bei Anlegen der Makrovariablen timestamp mittel call symput habe ich noch ein strip eingebaut, da sonst trotz cats den Sekundenbruchteilen in der Kontrollausgabe vor der schließenden Tilde noch Leerzeichen folgen. Die Makrovariable kann dann in der proc sql verwendet werden, nur muss sie in Anführungszeichen statt in Hochkommata eingeschlossen sein, da SAS sie sonst nicht auflöst. Das sollte dann eigentlich funktionieren.

Grüße
Steffen

call symputX

Hallo,
es gibt das relative neue call symputX statt des üblichen call symput. Damit kann man sich das strip() o.ä. sparen.

%LET TargetDay = 05AUG2010;

data _null_;
Datum_AKT = "&TargetDay."d;
Datum_Minus_1Monat = INTNX('MONTH',Datum_AKT,-1);

Tag_timestamp = put(Datum_Minus_1Monat,date9.);
Sel_timestamp = cats(Tag_timestamp , ":00:00:00.000000");
call symput ("timestamp", strip(Sel_timestamp)); * Alte Version ;
call symputX("timestampX",Sel_timestamp ); * Zum Vergleich ;
run;

%put timestamp : ~&timestamp.~; * Ausgabe ins Log zur Kontrolle;
%put timestampX: ~&timestampX.~; * Ausgabe ins Log zur Kontrolle;

Das call symputX ist auch bei numerischen Variablen eleganter, es macht die Konvertierung und lässt freiwillig alle unnötigen Leerzeichen weg!

data _null_;
zahl=123;
call symput ("N1", zahl ); * Alte Version, mit Warnung im log ;
call symput ("N0", put(zahl,9.0) ); * Alte Version, ohne Warnung im log ;
call symputX("N2", zahl ); * Zum Vergleich ;
run;
%put N1: ~&N1.~; * mit führenden Leerzeichen: Lästig+störend ;
%put N0: ~&N0.~; * mit führenden Leerzeichen: Lästig+störend ;
%put N2: ~&N2.~; * Ausgabe ins Log zur Kontrolle: Von alleine alles Prima!;

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Danke für den Tip mit call symputX!

Hallo,

das kann ich sicher auch künftig noch gut gebrauchen! Vielen Dank!

Viele Grüße,
Karin

Herzlichen Dank....

...Steffen!
Es funktioniert.

Viele Grüße,
Karin