在 SAS 中使用“<”运算符
Use of the '<' operator in SAS
我必须转换一些 SAS 代码。在其他编程语言中,我习惯于 < 用于比较,例如在伪代码中:If x < y then z
在SAS中,<运算符在这里实现了什么:
intck(month,startdate,enddate)-(day(enddate)<day(startdate))
我已经能够使用参考文档理解这些功能,但我看不到任何与此处“<”的使用方式相关的信息。
符号 <
是该表达式中的 运算符 。它不是 function 调用,就像 INTNX() 在您的表达式中一样。
SAS 将布尔表达式(如示例中的小于测试)计算为 1 表示真,0 表示假。
因此,当 ENDDATE 的月份日期小于 STARTDATE 的月份日期时,您的表达式将减去 1。
注意:你也可以反过来,把一个数字当作一个布尔表达式。例如在这样的语句中:
if (BASELINE) then PERCENT_CHANGE = (VALUE-BASELINE) / BASELINE ;
BASELINE 中的缺失值或零值将被视为 FALSE,因此在这些情况下赋值语句不会 运行。
只是为了更详细地了解您的代码在做什么,这是一种老式的方法来确定从一个日期到下一个日期的月数(例如,可能计算生日) .
最初,SAS 函数 intck
和 intnx
仅计算两个日期之间的“每月第一天”的数量(或其他时间间隔类似)。所以 INTCK('month','31OCT2020'd, '01NOV2020'd) = 1
,而 INTCK('month','01OCT2020'd,'30NOV2020'd) = 1
。不理想!因此,您将添加这段特定的代码,-(day(enddate)<day(startdate))
,它表示“如果它还不是 完整的 月,减去一个”。相当于:
if day(enddate) < day(startdate) then diff = intck(month,startdate,enddate) - 1;
else diff = intck(month,startdate,enddate);
现在有更好的方法来做到这一点(耶!)。 intck
and 'intnx' 有点不同,但思路是一样的。对于 intck
,参数是 method
,其中“连续”的 c
是您要比较的月份中的同一时期。对于 intnx
,它是 alignment
选项,其中 's'
表示“相同”(因此,移动到该月的同一点)。
所以你的代码现在应该是:
intck(month,startdate,enddate,'c')
我必须转换一些 SAS 代码。在其他编程语言中,我习惯于 < 用于比较,例如在伪代码中:If x < y then z
在SAS中,<运算符在这里实现了什么:
intck(month,startdate,enddate)-(day(enddate)<day(startdate))
我已经能够使用参考文档理解这些功能,但我看不到任何与此处“<”的使用方式相关的信息。
符号 <
是该表达式中的 运算符 。它不是 function 调用,就像 INTNX() 在您的表达式中一样。
SAS 将布尔表达式(如示例中的小于测试)计算为 1 表示真,0 表示假。
因此,当 ENDDATE 的月份日期小于 STARTDATE 的月份日期时,您的表达式将减去 1。
注意:你也可以反过来,把一个数字当作一个布尔表达式。例如在这样的语句中:
if (BASELINE) then PERCENT_CHANGE = (VALUE-BASELINE) / BASELINE ;
BASELINE 中的缺失值或零值将被视为 FALSE,因此在这些情况下赋值语句不会 运行。
只是为了更详细地了解您的代码在做什么,这是一种老式的方法来确定从一个日期到下一个日期的月数(例如,可能计算生日) .
最初,SAS 函数 intck
和 intnx
仅计算两个日期之间的“每月第一天”的数量(或其他时间间隔类似)。所以 INTCK('month','31OCT2020'd, '01NOV2020'd) = 1
,而 INTCK('month','01OCT2020'd,'30NOV2020'd) = 1
。不理想!因此,您将添加这段特定的代码,-(day(enddate)<day(startdate))
,它表示“如果它还不是 完整的 月,减去一个”。相当于:
if day(enddate) < day(startdate) then diff = intck(month,startdate,enddate) - 1;
else diff = intck(month,startdate,enddate);
现在有更好的方法来做到这一点(耶!)。 intck
and 'intnx' 有点不同,但思路是一样的。对于 intck
,参数是 method
,其中“连续”的 c
是您要比较的月份中的同一时期。对于 intnx
,它是 alignment
选项,其中 's'
表示“相同”(因此,移动到该月的同一点)。
所以你的代码现在应该是:
intck(month,startdate,enddate,'c')