将文本日期参数转换为宏中的 SAS 日期值

发布于 2024-11-02 19:12:38 字数 383 浏览 4 评论 0原文

我想创建一个 SAS 宏,它采用文字日期(例如“31may2011”d)作为参数。在宏内部,我想将其转换为 SAS 日期值(例如 18778)。

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = ???;  /* how to calculate this value ? */  
%mend;  
%transLiteralDate2Value(literal='31may2011'd);

是实现这一目标的优雅方法吗?当然,我可以通过解析文字字符串来做到这一点,但我认为必须有更好的方法。

我使用SAS 9.1.3

I want to create a SAS macro which takes a literal date (eg. '31may2011'd) as parameter. Inside the macro I want to transform this into a SAS date value (eg. 18778).

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = ???;  /* how to calculate this value ? */  
%mend;  
%transLiteralDate2Value(literal='31may2011'd);

Is the are elegant way to achieve this? Of course I could do this by parsing the literal string, but I think there must be a better way.

I use SAS 9.1.3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

月亮坠入山谷 2024-11-09 19:12:38

这将在宏内部或外部工作。不要忘记 %sysfunc() 有一个方便的可选第二个参数,它可以让您格式化输出值。

%let report_date = %sysfunc(sum('01JAN2011'd),best.);

%let report_date = %sysfunc(putn('01JAN2011'd,best.));

干杯

This will work inside or outside of a macro. Don't forget %sysfunc() has a handy optional second parameter which will let you format the output value.

%let report_date = %sysfunc(sum('01JAN2011'd),best.);

or

%let report_date = %sysfunc(putn('01JAN2011'd,best.));

Cheers
Rob

千里故人稀 2024-11-09 19:12:38

您可以使用 %sysfunc 宏函数来完成此操作。

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = %sysfunc(putn(&literal.,8.));
%mend;
%transLiteralDate2Value(literal='31may2011'd);

You can do it using the %sysfunc macro function.

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = %sysfunc(putn(&literal.,8.));
%mend;
%transLiteralDate2Value(literal='31may2011'd);
眼眸印温柔 2024-11-09 19:12:38

有一对像下面我的这样的简单转换宏很方便。另请参阅我的 sas-l 帖子

%macro date2num(date, informat=anydtdte.);
  %*-- strip quotations and postfix d from date literal if any. --*;
  %*-- quotations are intentionally doubled to prevent unmatched error --*;
  %let date=%sysfunc(prxchange(s/[''""]d?//i,-1,&date));
  %sysfunc(inputn(&date,&informat))
%mend  date2num;

%macro num2date(num, format=date10., literal=1);
  %local n;
  %let n = %sysfunc(putn(&num,&format));
  %if &literal %then "&n"d; %else &n;
%mend  num2date;

It is handy to have a pair of simple conversion macros like mine below. See also my sas-l posting.

%macro date2num(date, informat=anydtdte.);
  %*-- strip quotations and postfix d from date literal if any. --*;
  %*-- quotations are intentionally doubled to prevent unmatched error --*;
  %let date=%sysfunc(prxchange(s/[''""]d?//i,-1,&date));
  %sysfunc(inputn(&date,&informat))
%mend  date2num;

%macro num2date(num, format=date10., literal=1);
  %local n;
  %let n = %sysfunc(putn(&num,&format));
  %if &literal %then "&n"d; %else &n;
%mend  num2date;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文