SAS宏变量日期转DHMS格式异常问题求助
解决SAS宏变量日期转Datetime格式的问题
哦这个坑我之前也踩过!你现在得到奇怪的1960年日期,核心原因是直接把日期格式的字符串传给了putn()函数——putn()的第一个参数需要的是SAS的数值型日期/时间,而不是像01MAY2017这样的文本字符串。SAS会把这个字符串强行转成数字,得到的数值极小,对应到Datetime(从1960-01-01开始的秒数)自然就是年初的那些奇怪时间了。
给你两种简单的解决方法,都能得到你想要的01MAY2017:00:00:00格式结果:
方法一:先转日期值,再转Datetime数值
先把日期字符串转成SAS日期值(从1960-01-01开始的天数),再乘以86400(一天的秒数)得到当天0点的Datetime数值,最后格式化:
%let beg = 01MAY2017; %let end = 31OCT2017; %let start = %sysfunc(putn(%sysfunc(inputn(&beg, date9.)) * 86400, datetime20.)); %let end1 = %sysfunc(putn(%sysfunc(inputn(&end, date9.)) * 86400, datetime20.));
方法二:用DHMS函数直接生成Datetime值
这个方法更直观,用dhms()函数把日期值和0时0分0秒组合成Datetime数值,再格式化:
%let beg = 01MAY2017; %let end = 31OCT2017; %let start = %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&beg, date9.)), 0, 0, 0)), datetime20.)); %let end1 = %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&end, date9.)), 0, 0, 0)), datetime20.));
关键步骤解释:
%sysfunc(inputn(&beg, date9.)):把01MAY2017这个文本字符串转成SAS能识别的日期数值(比如20822,对应2017年5月1日)dhms(日期值, 0, 0, 0):把日期值和0小时、0分钟、0秒组合,生成当天0点的Datetime数值putn(数值, datetime20.):把Datetime数值转成你需要的DDMMMYYYY:HH:MM:SS格式字符串
你可以用%put &start; &end1;验证结果,肯定是你想要的正确Datetime格式啦!
内容的提问来源于stack exchange,提问作者suresh 999
相关产品推荐
相关产品推荐

