SAS宏以dhms格式表示日期

时间:2018-01-10 11:23:18

标签: sas

我有两个已解决的宏变量:

&beg is “01MAY2017”
&end is “31OCT2017”

我想创建具有日期格式dhms

的新宏

我尝试了以下查询,但我将1960年1月作为值:

%let start =%sysfunc(putn(&beg, datetime20.));
%let start1=%sysfunc(putn(&end, datetime20.));

以下是我得到的值:

01JAN1960:05:49:00
01JAN1960:05:53:03

我希望结果为01MAY2017:00:00:0031OCT2017:00:00:00

3 个答案:

答案 0 :(得分:2)

日期时间格式是您希望自1960年1月1日起提供的数量,但您已经为其提供了解析为天数的日期文字相反。在应用格式之前,请尝试使用dhms转换为日期时间:

%let BEG = '01MAY2017'd;
%let START = %sysfunc(dhms(&BEG,0,0,0),datetime20.);
%put START = &START;

答案 1 :(得分:1)

@ user667489拥有一个良好而灵活的解决方案。

如果您需要系统地添加:00:00:00,另一种方式就是:

%let start = %sysfunc(putn(&beg, date9.)):00:00:00;

答案 2 :(得分:0)

宏变量只包含文本。你如何使用它们决定了它们的含义。 SAS还将日期作为天数和日期时间存储为秒数。

现在,如果您的宏变量只包含一个看起来像DATE格式的日期的字符串,那么您只需附加一个看起来像TIME格式的时间的常量文本,就可以创建一个看起来像DATETIME格式的日期时间值的字符串。

%let beg=01MAY2017 ;
%let start=&beg.:00:00:00 ;

如果实际上宏变量中有日期值,则可以使用SAS函数将其转换为日期时间值。

例如,如果您的宏变量有日期文字,您可以使用DHMS()函数生成日期时间文字。

%let beg='01MAY2017'd ;
%let start="%sysfunc(dhms(&beg,0,0,0),datetime20)"dt ;

如果您的宏变量只有原始未格式化的日期值(即天数),那么您可以将其转换为秒数。

%let beg=20940;
%let start=%sysfunc(dhms(&beg,0,0,0));

最终你将获得START = 1809216000。