SAS:将数值转换为字符值

SAS:将数值转换为字符值,sas,Sas,我正在尝试转换datatime20。从数值到字符值。 目前,我有这样的数值:01Jan200:00:00:00,我需要将其转换为字符值,并接收输出,如:2020-01-01 00:00:00.0 上述文件应采用何种格式和信息? 我曾尝试使用PUT函数将数字转换为字符,并尝试了许多选项,每次都接收其他格式。在放入之前还应该使用DHMS函数吗?没有一种本机格式可以精确地生成该字符串。但使用现有格式分步骤构建并不困难。或者您可以使用PROC格式的PICTURE语句来构建自己的格式 如果您并不真正关心d

我正在尝试转换datatime20。从数值到字符值。 目前,我有这样的数值:01Jan200:00:00:00,我需要将其转换为字符值,并接收输出,如:2020-01-01 00:00:00.0

上述文件应采用何种格式和信息?
我曾尝试使用PUT函数将数字转换为字符,并尝试了许多选项,每次都接收其他格式。在放入之前还应该使用DHMS函数吗?

没有一种本机格式可以精确地生成该字符串。但使用现有格式分步骤构建并不困难。或者您可以使用PROC格式的PICTURE语句来构建自己的格式

如果您并不真正关心datetime值的时间部分,那么这是一种简单明了的方法,可以将具有秒数的数字变量DT转换为该样式的新字符变量。使用DATEPART()从datetime值获取日期(天数),然后使用YYMMDD格式为日期生成10个字符的字符串,然后仅附加格式化零的常量字符串

length dt_string $21.;
dt_string = put(datepart(dt),yymmdd10.)||' 00:00:00.0';
如果您需要一天中的时间部分,那么您也可以使用TOD格式

dt_string = put(datepart(dt),yymmdd10.)||put(dt,tod11.1);
或者可以使用格式E8601DT21.1,然后将日期和时间之间的字母T改为空格

dt_string = translate(put(dt,E8601DT21.1),' ','T');
如果您想了解datetime值的格式以及格式化结果的外观,可以运行一个小程序从元数据中提取格式并将其应用于特定的datetime值

data datetime_formats;
   length format $50 string $80 ;
   set sashelp.vformat;
   where fmttype='F';
   where also fmtinfo(fmtname,'cat')='datetime';
   keep format string fmtname maxw minw maxd ;
   format=cats(fmtname,maxw,'.','-L');
   string=putn('01Jan2020:01:02:03'dt,format);
run;

可以定义自定义格式以返回用户定义函数的结果


请向我们展示您的尝试。
proc format;
  value <format-name> (default=<width>)
    other = [<function-name>()]
  ;
run;
options cmplib=(sasuser.functions);

proc fcmp outlib=sasuser.functions.temporal;

  function E8601DTS (datetime) $21;
    return (
      translate (putn(datetime,'E8601DT21.1'),' ','T')
    );
  endsub;

run;

proc format;
  value E8601DTS (default=21)
    other = [E8601DTS()]
  ;
run;

data have;
  do dt = '01jan2020:0:0'dt to '10jan2020:0:0'dt by '60:00't;
    output;
  end;
  format dt datetime16.;
run;

ods html file='function-based-format.html';

proc print data=have(obs=4); title 'stock E8601DT';
proc print data=have(obs=4); title 'custom E8601DTS';
  format dt E8601DTS.;
run;
  
ods html close;