我有两个已解决的宏变量:
&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:00
和31OCT2017:00:00:00
答案 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。