我必须在Proc SQL中的where类中传递日期格式。
日期格式类似于“ SAT Mar 17 01:29:17 IST 2018”(字符串列,长度为28)
现在,当我尝试输入(Date,datetime18。)和其他一些日期函数时,却都给了我错误。以下是我的查询
proc sql;
Select input(Date,datetime18.) from table;
quit;
如何将此日期转换为简单的日期,例如“ 17-03-2018”,以便我可以在proc SQL查询中使用相同的日期?
答案 0 :(得分:1)
在许多情况下,ANYDTDTM
可以成为信息的去向,但是,正如您在注释中指出的那样,问题中显示的日期时间格式并非如此。
可以使用cats
和scan
将字符串重新排列为SAS可输入日期时间表示形式
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.
答案 1 :(得分:1)
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;
答案 2 :(得分:-1)
我使用了子字符串。我在数据集中创建了一个新列NEW_DATE。如上所述,日期格式为 IST 3 Mar 17 01:01:01 IST 。以下是获取日期的数据步骤,格式为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;
对我有用。
谢谢
在所有情况下都经过上述方法的检验,可以在所有情况下正常工作