You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:50:04