我正在编写SAS代码,因为我是SAS新手(一直在R上工作过),我无法理解SAS中的日期格式。
我有一个SAS数据集 Sales_yyyymm ,我正在创建一个代码,该代码接受用户输入的日期值,如果该日期存在Sales数据,我需要创建一个标记为1否则为0.目前我正在使用此代码 -
%Let check_date = 20010120;
Data A;
Set B;
If date=&check_date then Date_Flag = 1;
else Date_Flag = 0;
run;
日期是我的SAS数据集 Sales_yyyymm 中的日期列,值类似于20130129,20110412,20140120等。
但是如果我运行这段代码,我的所有Date_Flag值都为0. IF条件被忽略,我不确定这是怎么发生的。
有什么想法吗?
谢谢!
答案 0 :(得分:3)
您需要阅读Understanding How SAS Handles Dates文章,了解SAS如何在内部存储日期,以及如何执行日期算术,包括比较。
在SAS中,每个日期都是数字行上的唯一编号。日期之前 1960年1月1日,是负数;那些在1960年1月1日之后, 是积极的。由于SAS日期值是数字变量,您可以 轻松排序,确定时间间隔,并使用日期 常量,作为SAS函数或计算中的参数。
正如我在评论中提到的,您确实需要以“ddmmmyyyy”d格式指定日期文字。
因此,%Let check_date = 20010120;
应写为:
%Let check_date = 20JAN2001;
Data A;
Set B;
If date="&check_date."d then Date_Flag = 1;
else Date_Flag = 0;
run;
翻译成SAS日期的 20010120
超出了SAS可以处理的有效范围。例如:2001012
- 注意最后没有零,对应"03AUG7438"
- 是的,那是7438年!!
而14995
是SAS理解为日期的整数20JAN2001