Base SAS 中的日期格式
Date Format in Base SAS
我必须在 Class.
中的 Proc SQL 中传递日期格式
日期格式是这样的"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 查询中使用相同的日期?
在许多情况下,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.
我使用 sub-string.I 在数据集中创建了一个新列 NEW_DATE。如上所述,日期格式为 Sat Mar 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;
它对我有用。
谢谢
在所有情况下检查了上述方法,在所有情况下都可以正常工作
日期是数字,你不应该将它与字符串值进行比较,通过将你的值也转换为日期来将它与日期文字进行比较。将大于和小于值与字符串进行比较,通常没有任何用处,并且可能导致错误的结果。比较数值变量时,小于和大于具有 meaning/make 意义
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;
我必须在 Class.
中的 Proc SQL 中传递日期格式日期格式是这样的"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 查询中使用相同的日期?
在许多情况下,ANYDTDTM
可以成为信息格式,但是,正如您(在评论中)指出的那样,问题中显示的日期时间格式并非如此。
可以使用 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.
我使用 sub-string.I 在数据集中创建了一个新列 NEW_DATE。如上所述,日期格式为 Sat Mar 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;
它对我有用。
谢谢
在所有情况下检查了上述方法,在所有情况下都可以正常工作
日期是数字,你不应该将它与字符串值进行比较,通过将你的值也转换为日期来将它与日期文字进行比较。将大于和小于值与字符串进行比较,通常没有任何用处,并且可能导致错误的结果。比较数值变量时,小于和大于具有 meaning/make 意义
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;