如何在SAS中创建日期时间宏变量


%let mydate = "01JUN2021 00:00:00.000"dt;

这不起作用。如何在不使用proc sqldata步骤的情况下创建日期时间宏变量?

纯宏解决方案是:

%let mydate = %sysfunc(dhms(%sysfunc(mdy(6,1,2021)), 0, 0, 0));
%put &=mydate; * PRINTS THE UNFORMATTED VALUE STORED;
%put %sysfunc(sum(&mydate), datetime22.); * PRINTS THE DATETIME VALUE FORMATTED;

输出:

MYDATE=1938124800
01JUN2021:00:00:00

当然,如果您更清楚的话,您可以在单独的行上执行dhms()mdy()函数。

将其与您的原始代码进行比较:

%let mydate="01jan2021:00:00:00"dt;
%put &=mydate;

打印:

MYDATE="01jan2021:00:00:00"dt

请注意,在您的方法中,字符串"01jan2021:00:00:00"dt是如何保存到宏变量中的,而不是实际的数字日期值1938124800?有时,当你使用你的方法时,SAS会感到困惑,因为你试图使用该值,但它无法将文字转换为数字日期值。

尝试%let mydate = '1Jan2021:0:0:1'dt请注意,它使用单引号&日期和时间之间没有空格

您发布的宏变量在SAS代码中运行良好。

82   %let mydate = "01JUN2021 00:00:00.000"dt;
83
84   data test;
85    now = datetime();
86    then = &mydate;
87    diff = intck('dtday',then ,now);
88    format now then datetime20. ;
89    put (_all_) (=);
90   run;
now=16JUN2021:08:18:33 then=01JUN2021:00:00:00 diff=15
NOTE: The data set WORK.TEST has 1 observations and 3 variables.
NOTE: DATA statement used (Total process time):
real time           0.01 seconds
cpu time            0.01 seconds

如果需要在直通SQL代码中使用该值,则需要将宏变量设置为文本,SQL的远程数据库实现将其识别为日期时间值。

所以也许

%let myts = timestamp '2021-06-01 00:00:00.000';

最新更新