楼主: 木叶知秋
2397 10

[问答] 关于宏中时间常数的比较 [推广有奖]

  • 0关注
  • 2粉丝

博士生

10%

还不是VIP/贵宾

-

威望
0
论坛币
1237 个
通用积分
0.0002
学术水平
29 点
热心指数
30 点
信用等级
31 点
经验
3622 点
帖子
110
精华
0
在线时间
304 小时
注册时间
2009-3-29
最后登录
2023-9-8

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. %macro test;
  2. %if %sysfunc(intnx(month,'15SEP2015'd,3,s))>'15DEC2015'd %then %put aa;
  3. %else %put bb;
  4. %if %sysfunc(intnx(month,'15SEP2015'd,3,s))>20437 %then %put aa;
  5. %else %put bb;
  6. %mend;
  7. %test;
复制代码
为什么宏里面时间常数不能做比较
上面的代码写成时间常数就无法比较,输出的是aa
换成该常数对应的数值就可以比较,输出的是bb
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sysfunc month Macro else Then

回帖推荐

co_fund 发表于7楼  查看完整内容

原因应该是宏用的是ASC码,可以用以下代码避免这个问题。 %macro test; %if %sysevalf(%sysfunc(intnx(month,'15SEP2015'd,3,s)) = '15DEC2015'd) %then %put aa1; %else %put bb1; %mend; %test;
沙发
co_fund 发表于 2016-1-19 11:11:54 |只看作者 |坛友微信交流群
首先,用代码也是可以比较的。
如果改成>=号,结果就都是aa了。
问题在于为什么>号不行,还在研究

使用道具

藤椅
yongyitian 发表于 2016-1-19 11:18:40 |只看作者 |坛友微信交流群
宏里面的 %IF ... %then 语句是比较两个字符串的大小。
你的程序中 第一个%if 语句比较的是 字符 "20346" 与 "‘15DEC2015’d" 的大小。
           第一个%if 语句比较的是 字符 ‘20346’ 与 ‘20437’ 的大小。

  1. %macro test;

  2.     %if %sysfunc(intnx(month,'15SEP2015'd,3,s)) > '15DEC2015'd %then %put aa1;
  3.     %else %put bb1;

  4.     %if '15DEC2015'd > %sysfunc(intnx(month,'15SEP2015'd,3,s)) %then %put aa2;
  5.     %else %put bb2;

  6.     %if '15DEC2015'd > 20346 %then %put aa3;
  7.     %else %put bb3;

  8.     %if  20437 > 20346 %then %put aa4;
  9.     %else %put bb4;

  10.     %if %sysfunc(intnx(month,'15SEP2015'd,3,s)) > 20437 %then %put aa5;
  11.     %else %put bb5;

  12.     %if a > b %then %put A greater than B;
  13.     %else %put Is A not greater then B?;
  14. %mend;
  15. %test;

  16. data _null_;
  17.    if "20346" gt "15DEC2015'd" then put 'AA';
  18.    else put 'BB';

  19.    if "20346" gt "20437" then put 'AA';
  20.    else put 'BB';
  21. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
木叶知秋 + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

板凳
co_fund 发表于 2016-1-19 11:20:42 |只看作者 |坛友微信交流群
follow up
    %macro test;
    %if 20437>'15DEC2015'd %then %put aa;
    %else %put bb;
    %mend;
    %test;
结果是aa 说明20437>'15DEC2015'd

使用道具

报纸
co_fund 发表于 2016-1-19 11:29:25 |只看作者 |坛友微信交流群
yongyitian 发表于 2016-1-19 11:18
宏里面的 %IF ... %then 语句是比较两个字符串的大小。
你的程序中 第一个%if 语句比较的是 字符 "20346" ...
不太同意你的观点。
根据下面的程序和结果,%sysfunc(intnx(month,'15SEP2015'd,3,s))和20346或者“20346”并不相等。
第一个%if 语句比较的自然也不是 字符"20346" 与 "‘15DEC2015’d" 的大小。
   %macro test;
    %if %sysfunc(intnx(month,'15SEP2015'd,3,s))=20346 %then %put aa;
    %else %put bb;
    %if %sysfunc(intnx(month,'15SEP2015'd,3,s))=20437 %then %put aa;
    %else %put bb;
        %if %sysfunc(intnx(month,'15SEP2015'd,3,s))='20346' %then %put aa;
    %else %put bb;
    %if %sysfunc(intnx(month,'15SEP2015'd,3,s))='20437' %then %put aa;
    %else %put bb;
    %mend;
    %test;
结果是
bb
aa
bb
bb

使用道具

地板
yongyitian 发表于 2016-1-19 12:47:22 |只看作者 |坛友微信交流群
co_fund 发表于 2016-1-19 11:29
不太同意你的观点。
根据下面的程序和结果,%sysfunc(intnx(month,'15SEP2015'd,3,s))和20346或者“203 ...
MP767.JPG

使用道具

7
co_fund 发表于 2016-1-19 13:05:20 |只看作者 |坛友微信交流群
原因应该是宏用的是ASC码,可以用以下代码避免这个问题。
%macro test;
        %if %sysevalf(%sysfunc(intnx(month,'15SEP2015'd,3,s)) = '15DEC2015'd) %then %put aa1;
        %else %put bb1;   
    %mend;
    %test;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
木叶知秋 + 5 + 1 + 1 + 1 精彩帖子
yongyitian + 5 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 10  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

使用道具

8
Tigflanker 发表于 2016-1-19 16:02:56 |只看作者 |坛友微信交流群
个人理解:

对于比号前后两坨,SAS先判断是不是都是整型,都是的话,按照正常判断;
有一方不是的话,就按照字符型看待,从左往右一个一个取字符,按照ASCII大小比较
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
木叶知秋 + 5 + 1 + 1 + 1 精彩帖子
yongyitian + 5 + 3 + 3 + 3 分析的有道理

总评分: 论坛币 + 10  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

使用道具

9
木叶知秋 发表于 2016-1-19 21:14:10 |只看作者 |坛友微信交流群
co_fund 发表于 2016-1-19 13:05
原因应该是宏用的是ASC码,可以用以下代码避免这个问题。
%macro test;
        %if %sysevalf(%sysfunc ...
正解,应该是当成字符比较了,用%sysevalf可以解决,谢谢各位
还有个问题是:
  1. data aa;
  2. input a yymmdd10.;
  3. format a yymmdd10.;
  4. cards;
  5. 2015/11/05
  6. 2015/12/06
  7. ;
  8. %macro test(data_month);
  9. data bb;
  10. set aa;
  11. where a=&data_month.;
  12. run;
  13. %mend;
  14. %test('06DEC2015'd)
复制代码
我有类似test的以时间常数字符串为参数的macro,怎么快捷的把通过intnx计算出来的值变成时间常数形式作为参数带入

使用道具

10
co_fund 发表于 2016-1-20 08:52:16 |只看作者 |坛友微信交流群
我的方案是这样的
%macro test(date);
data _null_;
call symput('date2',put(intnx('Month',&date.,3,'s'),date9.));
run;
%put &date2.;
%mend test;
%test('15SEP2015'd);

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 10:41