【问题标题】:If-Then Block Issue in SASSAS 中的 If-Then 块问题
【发布时间】:2014-03-27 19:42:44
【问题描述】:

我正在编写 SAS 代码,由于我是 SAS 新手(一直从事 R 工作),我无法理解 SAS 中的日期格式。

我有一个 SAS 数据集 Sales_yyyymm,我正在创建一个代码,该代码接受用户输入的日期值,如果该日期存在销售数据,我需要创建一个标志为 1否则为 0。目前我正在使用此代码 -

%Let check_date = 20010120;

 Data A;
  Set B;
 If date=&check_date then Date_Flag = 1;
 else Date_Flag = 0;
 run;

date 是我的 SAS 数据集 Sales_yyyymm 中的日期列,其值类似于 201301292011041220140120 等。

但是,如果我运行此代码,我的所有 Date_Flag 值都为 0。IF 条件被忽略,我不确定这是如何发生或为什么发生的。

有什么想法吗?

谢谢!

【问题讨论】:

  • 我怀疑date 列实际上是一个日期,其格式显示为 yyyymmdd,即日期不是 8 位整数。检查proc contents data =<your dataset>; run; 输出并报告date 列的类型和格式
  • 还有一件事——在 SAS 中,日期文字应该是“DDMMMYYYY”d 格式。如果事实上 date 列确实存储为日期类型列,这将很重要。
  • 我刚查了一下,发现date列的类型为NUM和Len 4,格式为YYMMDDN8。
  • SAS 中的 Format 只是一种打印人眼看起来不错的东西的方法——类似于在 c++ 中使用sprintf。它与基础价值无关,也不允许在等式中使用(没有其他一些功能,如put,它直接等效于sprintf)。

标签: date if-statement sas


【解决方案1】:

您需要阅读Understanding How SAS Handles Dates 文章以了解 SAS 如何在内部存储日期以及如何执行包括比较在内的日期算术运算。

在 SAS 中,每个日期都是数轴上的唯一数字。之前的日期 1960 年 1 月 1 日是负数; 1960 年 1 月 1 日之后的人, 是积极的。因为 SAS 日期值是数值变量,所以您可以 轻松排序,确定时间间隔,并将日期用作 常量,作为 SAS 函数或计算中的参数。

正如我在 cmets 中提到的,您确实需要以“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;

20010120 转换为 SAS 日期超出了 SAS 可以处理的有效范围。例如:2001012 - 注意末尾没有零,对应于 "03AUG7438" - 是的,那是 7438 年!!

14995 是 SAS 理解为日期 20JAN2001 的整数

【讨论】:

  • 谢谢!这有帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多