Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何将SAS表中的所有DATETIME变量转换为DATE9_Loops_Date_Sas_Datetime Format - Fatal编程技术网

Loops 如何将SAS表中的所有DATETIME变量转换为DATE9

Loops 如何将SAS表中的所有DATETIME变量转换为DATE9,loops,date,sas,datetime-format,Loops,Date,Sas,Datetime Format,我在SAS中有一个表,其中表示日期的所有变量都在DATETIME20中。格式,我想把它们转换成DATE9。格式。假设我的SAS表中有3个datetime变量(date1、date2、date3),我想将它们转换为DATE9。保留其原始名称(日期1、日期2、日期3)。我希望代码是灵活的,这样,如果我更改变量名称-更改代码序言中(date1,date2,date3)的名称-那么代码仍然有效,也就是说,我希望代码适用于这些日期变量的不同名称和数量。我在SAS中有以下代码: %let dates = (

我在SAS中有一个表,其中表示日期的所有变量都在DATETIME20中。格式,我想把它们转换成DATE9。格式。假设我的SAS表中有3个datetime变量(date1、date2、date3),我想将它们转换为DATE9。保留其原始名称(日期1、日期2、日期3)。我希望代码是灵活的,这样,如果我更改变量名称-更改代码序言中(date1,date2,date3)的名称-那么代码仍然有效,也就是说,我希望代码适用于这些日期变量的不同名称和数量。我在SAS中有以下代码:

%let dates = ('date1', 'date2', 'date3');

data my_table;
set my_table;
    array numvars _NUMERIC_;
    do _t = 1 to dim(numvars);
        if upcase(vname(numvars[_t])) in &dates. then do;
            numvars[_t] = datepart(numvars[_t]);
        end;
    end;
run;

但是,这不会将我的(date1、date2、date3)变量转换为DATE9。但是在这个转换之后,它们仍然是带有不正确值的日期时间变量。我希望能够更改日期(&D)。第一行的宏变量,这样我就不必更改该行之后的代码。

除了将存储的值从秒更改为天(通过使用DATEPART()函数),还需要更改用于显示值的格式。使宏变量仅保留变量名列表,以便在SAS代码中使用

%let dates = date1 date2 date3 ;

data my_table;
  set my_table;
  array dtvars &dates ;
  do _t = 1 to dim(dtvars);
    dtvars[_t] = datepart(dtvars[_t]);
  end;
  format &dates date9.;
run;
如果要使其更具动态性,请使用FMTINFO()函数查找现有的日期时间变量。FMTINFO()函数只需要格式名称,而不是完整的格式规范,因此处理PROC内容的输出比处理字典视图更容易

%let dsnin=example;
%let dsnout=example_date;

proc contents data=&dsnin noprint out=contents; run;

proc sql noprint;
 select nliteral(name)
   into :varlist separated by ' '
   from contents 
   where fmtinfo(format,'cat')='datetime'
 ;
%let nvars=&sqlobs;
quit;

data &dsnout;
  set &dsnin;
%if &nvars %then %do;
  array _dt &varlist ;
  do over _dt; _dt = datepart(_dt); end;
  format &varlist date9.;
%end;
run;
您甚至可以将SQL查询更改为仅测试已放入DATES宏变量中的特定变量

   where fmtinfo(format,'cat')='datetime'
     and findw("&dates",name,' ','sit')

除了将存储的值从秒更改为天(使用DATEPART()函数),还需要更改用于显示值的格式。使宏变量仅保留变量名列表,以便在SAS代码中使用

%let dates = date1 date2 date3 ;

data my_table;
  set my_table;
  array dtvars &dates ;
  do _t = 1 to dim(dtvars);
    dtvars[_t] = datepart(dtvars[_t]);
  end;
  format &dates date9.;
run;
如果要使其更具动态性,请使用FMTINFO()函数查找现有的日期时间变量。FMTINFO()函数只需要格式名称,而不是完整的格式规范,因此处理PROC内容的输出比处理字典视图更容易

%let dsnin=example;
%let dsnout=example_date;

proc contents data=&dsnin noprint out=contents; run;

proc sql noprint;
 select nliteral(name)
   into :varlist separated by ' '
   from contents 
   where fmtinfo(format,'cat')='datetime'
 ;
%let nvars=&sqlobs;
quit;

data &dsnout;
  set &dsnin;
%if &nvars %then %do;
  array _dt &varlist ;
  do over _dt; _dt = datepart(_dt); end;
  format &varlist date9.;
%end;
run;
您甚至可以将SQL查询更改为仅测试已放入DATES宏变量中的特定变量

   where fmtinfo(format,'cat')='datetime'
     and findw("&dates",name,' ','sit')

您知道输入数据集中已经存在DATE1、DATE2和DATE3吗?您知道输入数据集中已经存在DATE1、DATE2和DATE3吗?非常酷,非常灵活,谢谢。我希望我也能这样编程。非常酷,非常灵活,谢谢。我希望我也能像那样编程。