楼主: Tigflanker
1340 3

[原创博文] 问个关于日期计算的问题 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2012-9-18 01:25:47 |AI写论文
50论坛币
想向老师们请教一个日期计算的问题:
(首先,假定有一个数据集叫做abc,它里面有两列变量叫做date1和date2,都是例如20120918这样的8位数值,先不考虑存在缺失值)

我自己写了一个宏,期望的功能是打开一个数据集,算出里面指定两列8位数值型日期变量的时间间隔,存为一列新变量。

例如:原来的数据集为:

date1 date2
20120101 20120103
20121001 20121005

调用宏%di(abc,date1,date2,days);

处理后的数据集为:

date1 date2 days
2012010120120103 2
2012100120121005 4

我写的宏如下:

  1. *****1.这是之前写好的,但是这个不能对数据集操作,只能单入单出*****;
  2. %macro di(date0,date1);
  3. %do i=0 %to 1;
  4. %let d&i.y=%sysfunc(int(%eval(&&date&i./10000)));
  5. %let d&i.m=%sysfunc(int(%eval(&&date&i./100-&&d&i.y*100)));
  6. %let d&i.d=%eval(&&date&i.-&&d&i.y*10000-&&d&i.m*100);

  7. %let date&i.=%sysfunc(mdy(&&d&i.m,&&d&i.d,&&d&i.y));
  8. %end;

  9. %eval(&date1-&date0)       *本句作为本宏的返回值;
  10. %mend di;

  11. *****2.这是现在想写的,估计也没写完,自己已经开始晕了*****;
  12. %macro di(dataset,date0,date1,result);  *result=date1后-date0前;
  13. data &dataset;set &dataset;
  14. keep &date0 &date1;
  15. rename &date0=date0 &date1=date1;
  16. run;

  17. d0y=int(&date0/10000);
  18. d0m=int(date0/100-d0y*100);
  19. d0d=date0-d0y*10000-d0m*100;

  20. date0=mdy(d0m,d0d,d0y);

  21. d1y=int(date1/10000);
  22. d1m=int(date1/100-d1y*100);
  23. d1d=date1-d1y*10000-d1m*100;

  24. date1=mdy(d1m,d1d,d1y);

  25. result=date1-date0;
  26. run;
  27. %mend di;
复制代码

无论解答与否,感谢感谢。

最佳答案

pobel 查看完整内容

data abc; input date0 date1; cards; 20120101 20120103 20121001 20121005 ; %macro di(dataset,date0,date1,result); *result=date1后-date0前; data &dataset;set &dataset; d0y=int(&date0/10000); d0m=int(&date0/100-d0y*100); d0d=mod(&date0,100); date0=mdy(d0m,d0d,d0y); d1y=int(&date1/10000); d1m=int(&date1/100-d1y*100); d1d=mod(&date1,100); date1=mdy(d1m,d1d,d1y); ...
关键词:dataset sysfunc Result rename RESUL

沙发
pobel 在职认证  发表于 2012-9-18 01:25:48

data abc;
  input date0 date1;
  cards;
20120101  20120103
20121001  20121005
;

%macro di(dataset,date0,date1,result);  *result=date1后-date0前;
data &dataset;set &dataset;
d0y=int(&date0/10000);
d0m=int(&date0/100-d0y*100);
d0d=mod(&date0,100);

date0=mdy(d0m,d0d,d0y);

d1y=int(&date1/10000);
d1m=int(&date1/100-d1y*100);
d1d=mod(&date1,100);

date1=mdy(d1m,d1d,d1y);


&result=date1-date0;
keep &date0 &date1 date0 date1 &result;
format date0 date1 yymmdd10.;

run;

%mend di;


%di(abc,date0,date1,result)
和谐拯救危机

藤椅
playmore 发表于 2012-9-18 09:37:53
lz可以参考下面我发的贴
https://bbs.pinggu.org/thread-1581992-1-1.html

先把你表格内的数值型变量彻底改为日期型变量
这样就可以简单的用INTCK函数计算日期间隔了
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 感谢,INTCK,新知识。

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

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

板凳
Tigflanker 发表于 2012-9-18 22:04:02
pobel 发表于 2012-9-18 01:25
data abc;
  input date0 date1;
  cards;
很帅,谢谢。
Bye SAS.
若有缘,能重聚。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 19:25