Во многих случаях ANYDTDTM
может быть полезен для информации, однако, как вы указали (в комментариях), это не так для формата даты и времени, представленного в вопросе.
Строка может быть перестроена в виде даты и времени в SAS с использованием cats
и scan
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;
. Макрос также может использоваться в выражениях where
, таких как
where '18-Mar-2018:0:0'DT <= %dts_to_datetime (date_string)
Или SQL
, %dts_to_datetime (date_string) as event_dtm format=datetime20.
date является числовым значением, и вы не должны сравнивать его со строковым значением, сравнивайте его с литералом даты, преобразовав также ваше значение в date. сравнение больших и меньших значений со строками, как правило, не служит какой-либо цели и может привести к ошибочным результатам. меньше и больше чем имеет смысл / смысл при сравнении числовых переменных
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;
Я использовал подстроку. Я создал новый столбец NEW_DATE в наборе данных. Как упоминалось выше, формат даты: Сб 17 марта 01:01:01 IST 2018 . Ниже приведен шаг данных для извлечения даты в формате DD-MMM-YYYY
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;
, затем я использую новый столбец в proc sql
proc sql;
select * from new where new_date_updated>'17-Mar-2018'd;
quit;
, и это сработало для меня. 114]
Спасибо
Проверено выше подход со всеми сценариями, отлично работает со всеми