SAS宏以dhms格式表示日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAS宏以dhms格式表示日期相关的知识,希望对你有一定的参考价值。

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

&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

答案

日期时间格式期望您提供自1960年1月1日以来的秒数,但您已经为它提供了一个日期文字,它可以解析为天数。在应用格式之前,尝试使用dhms转换为datetime:

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

@ user667489具有良好而灵活的解决方案。

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

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

宏变量只包含文本。你如何使用它们决定了它们的含义。 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。

以上是关于SAS宏以dhms格式表示日期的主要内容,如果未能解决你的问题,请参考以下文章

DHMS将日期和时间连接到日期时间导致第一个日期为1960年1月1日

SAS更改日期格式

在SAS中导入CSV数据时如何设置正确的日期格式?

sas将几分几秒转化为秒

SAS:在where子句中将日期时间转换为日期

SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式