我有一个sas数据集,其日期字段的格式为“04JAN2012”并使用格式,我在单独的数据步骤中将其转换为“2012-01-04”。 当我在proc SQL中使用一个简单的where语句时出现问题,该语句使用'where'条件,如---- select * from temp,其中temp.active_date> '2012-01-01'
此时的错误消息是“使用等于(>)的表达式具有不同数据类型的组件。”
请帮忙!
答案 0 :(得分:3)
最好的方法是在进行过滤之前将字符串('2012-01-01')转换为SAS日期,例如通过宏:
%let date_filter='2012-01-01';
%let mydate=%sysfunc(mdy(
%substr(&date_filter,7,2)
,%substr(&date_filter,10,2)
,%substr(&date_filter,2,4)));
proc sql;
select * from temp where temp.active_date > &mydate;
答案 1 :(得分:2)
如果你正在使用FORMAT
而不是PUT
(内部转换为字符),那么你实际上并没有改变任何关于日期的显示方式(并在某些分组函数中使用) )。在内部,active_date
仍然是数字SAS日期。
因此,您只需使用正确的日期常量格式。当您使用PROC SQL时,您仍然使用SAS,它以不同于SQL Server或Oracle的方式格式化日期常量。
'01JAN2012'd
是日期常量的正确格式,因此您的代码应为:
select * from temp where temp.active_date > '01JAN2012'd;
如果以某种方式生成此比较值(不将其写入代码),则可以通过将生成的值PUT(或格式化)为DATE9.
格式来正确生成它。