sas中的日期函数问题

时间:2013-12-24 10:11:51

标签: date sas

我有一个sas数据集,其日期字段的格式为“04JAN2012”并使用格式,我在单独的数据步骤中将其转换为“2012-01-04”。 当我在proc SQL中使用一个简单的where语句时出现问题,该语句使用'where'条件,如---- select * from temp,其中temp.active_date> '2012-01-01'

此时的错误消息是“使用等于(>)的表达式具有不同数据类型的组件。”

请帮忙!

2 个答案:

答案 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.格式来正确生成它。