Ich muss das Datumsformat in Proc SQL in der where-Klasse übergeben.

Das Datumsformat ist wie folgt: "SAT Mar 17 01:29:17 IST 2018" (String Column, Länge ist 28)

Jetzt, wenn ich versucht habe, Eingaben (Datum, Datum / Uhrzeit18.) Und einige andere Datumsfunktionen, aber alle geben mir Fehler. Unten ist meine Anfrage

proc sql;
Select input(Date,datetime18.) from table;
quit;

Wie konvertiere ich dieses Datum in ein einfaches Datum wie "17-03-2018", damit ich dasselbe in der Proc SQL-Abfrage verwenden kann?

0
Rajesh 18 Jän. 2019 im 11:15

3 Antworten

Beste Antwort

Ich habe eine neue Zeichenfolge verwendet. Ich habe eine neue Spalte NEW_DATE in Dataset erstellt. Wie oben erwähnt, ist das Datumsformat Sa 17. März 01:01:01 IST 2018 . Unten finden Sie den Datenschritt zum Abrufen des Datums im Format TT-MMM-JJJJ

data new;
set old;
new_date = substr(date,9,2)||"-"||substr(date,5,3)||"-"||substr(date,25,4);
new_date_updated = input(new_date,date11.);
format new_date_updated date11.;
run;

Dann benutze ich neue spalte in proc sql

proc sql;
select * from new where new_date_updated>'17-Mar-2018'd;
quit;

Und es hat bei mir funktioniert.

Vielen Dank

Der obige Ansatz wurde mit allen Szenarien überprüft und funktioniert mit allen gut

-1
Rajesh 30 Jän. 2019 im 13:32

Das Datum ist numerisch und Sie sollten es nicht mit dem Zeichenfolgenwert vergleichen. Vergleichen Sie es mit dem Datumsliteral, indem Sie Ihren Wert auch in Datum konvertieren. Der Vergleich von größeren und kleineren Werten mit Zeichenfolgen hat im Allgemeinen keinen Zweck und kann zu fehlerhaften Ergebnissen führen. kleiner als und größer als haben Bedeutung / Sinn, wenn Sie numerische Variablen vergleichen

 data have;
 b = "SAT Mar 17 01:29:17 IST 2018";
 output;
 b= "SAT Mar 19 01:29:17 IST 2018";
output;
 b= "SAT Jun 20 01:29:17 IST 2018";
output;
b= "SAT Mar 25 01:29:17 IST 2018";
output;
run;


proc sql;
select * from have
where input(cats(scan(b,3),scan(b,2), scan(b, -1)),date9.) > "19Mar2018"d;
1
Kiran 18 Jän. 2019 im 17:40

Das ANYDTDTM kann in vielen Fällen eine Informationsquelle sein. Wie Sie jedoch (in Kommentaren) hervorheben, gilt dies nicht für das in der Frage dargestellte Datum / Uhrzeit-Format.

Die Zeichenfolge kann mithilfe von cats und scan in eine von SAS eingegebene Datums- / Uhrzeitdarstellung umgeordnet werden.

data have;    
  date_string = "SAT Mar 17 01:29:17 IST 2018";    
run;

data want;
  set have;

  dt_wrong = input(date_string, anydtdtm.);

  dt_right = input ( cats 
          ( scan(date_string,3),
            scan(date_string,2),
            scan(date_string,6),':',
            scan(date_string,4)
          ), datetime20.);

  put date_string= /;
  put dt_right= datetime20. " from input of cats of string parts";
  put dt_wrong= datetime20. " from anydttm ";
run;

* sample macro that can be applied in data step or sql;

%macro dts_to_datetime(dts);
  input ( cats 
          ( scan( &dts , 3),
            scan( &dts , 2),
            scan( &dts , 6), ':',
            scan( &dts , 4)
          )
        , datetime20.)
%mend;

data want2;
  set have;
  dt_righton = %dts_to_datetime(date_string);

  format dt_righton datetime20.;

  put dt_righton=;
run;

Das Makro kann auch in where Anweisungen wie verwendet werden

where '18-Mar-2018:0:0'DT <= %dts_to_datetime (date_string)

Oder SQL

, %dts_to_datetime (date_string) as event_dtm format=datetime20.
1
Richard 30 Jän. 2019 im 16:08