不管是在报表自动化还是运营数据自动化中,总会涉及变量,这些变量随着参数的设置,其他相关字段变动或者时间的变动而改变,从而实现数据的动态运转。
以下为以时间变量为例,分享在使用SAS过程中时间变量的几种设置方式;另外补充时间格式和时间函数的说明。
时间变量
简单的时间设置
通常用以下两个函数直接来限制数据的时间范围
使用INTNX函数
例如INTNX('DAY',date(),-1)指的是前一天的时间,INTNX('month',date(),-1)指的是前一个月的时间
使用INTCK函数
PERIOD=INTCK('MONTH',STARTDATE1,ENDDATE1)指两个时间的月份的间隔
使用Imdy函数
mdy(5,1,2020)指2020年5月1日日期
变量的定义:%let date_var=%sysfunc(mdy(5,1,2020),YYMMDD10.);
- 例子:
数据集名称 source
字段名 num createtime
data source_new; /* 取近一个月的数据,假设当天为10月24日,数据所取时间9月24日-10月23日 */
set source;
if createtime>=INTNX('month',date(),-1) and createtime<=INTNX('DAY',date(),-1);
run;
data source_new; /* 取上个月一整个月和当月数据,假设当天为10月24日,数据所取时间9月1日-10月23日 */
set source;
if PERIOD=INTCK('MONTH',createtime,date())<=1;
run;
通过以上例子清晰地说明了INTNX和INTCK函数分别的功能。
定义变量
以下有三种方式定义变量:
%let的方式生成变量
proc sql 语句中使用 “into” 生成变量
data 语句中使用 “call symputx”生成变量
- 例子1:简单的变量定义
data variable;
target=put(INTNX('month',INTNX('DAY',date(),-1),-1),yymmn6.);
call symputx('yearmonth',compress(target)) /* 取前一天的前一个月的年月(字符类型)作为变量 */
run;
data linshi;
set PC_&yearmonth(obs=100);
run;
- 例子2:合并多有名称有规律的表
%macro test;
%do i=1 %to 6;
data variable;
target=put(INTNX('month',INTNX('DAY',date(),-1),-&i+1),yymmn6.);
run;
proc sql;
select target
into:yearmonth&i
from variable;
quit;
%end;
data linshi;
set
PC_&yearmonth6(keep=gd datepart ul uid dm)
PC_&yearmonth5(keep=gd datepart ul uid dm)
PC_&yearmonth4(keep=gd datepart ul uid dm)
PC_&yearmonth3(keep=gd datepart ul uid dm)
PC_&yearmonth2(keep=gd datepart ul uid dm)
PC_&yearmonth1(keep=gd datepart ul uid dm)
;
run;
%mend;
%test;
- 例子3: /* 近7天周期五的时间对应的年月日变量 */
data VARIABLE;
FORMAT target_date YYMMDD10.;INFORMAT target_date YYMMDD10.;
do i=0 to 6;
if weekday(INTNX('DAY',date(),i))=6 then target_date=INTNX('DAY',date(),i);
end;
drop i;
run;
proc sql;
select year(target_date) into: next_send_year from VARIABLE;
select month(target_date) into: next_send_month from VARIABLE;
select day(target_date) into: next_send_day from VARIABLE;
quit;
- 例子4:/* 如果运行时间为当月的第一天的话,则执行指定路径下SAS程序 */
%let date_var=%sysfunc(today(),YYMMDD10.);
%let day_var=%substr(&date_var,9,2);
%if &day_var=01 %then %do;
%include "d:\code\mycode.sas";
%end;
另外,变量分为全局变量和局部变量,通常在宏里面没有定义为全局变量的情况的话,为局部变量,这时候变量只适用于宏过程中。其他时候为全局变量,这里不一一举例。
时间格式和时间函数
时间戳
时间格式
字符型格式
以下为常用的时间函数:
data linshi01;
format now_date1 yymmdd10.; /*数值型日期 */
format now_date2 is8601dt20.; /*数值型日期+时间*/
format now_date3 NLDATM20.; /*数值型日期+时间*/
now_date1=date();
now_date2=datetime();
now_date3=datetime();
now_date4=put(now_date1,yymmdd10.); /* 数值型时间转化为字符型,无需指定format格式 */
now_date5=put(now_date2,NLDATM20.); /* 数值型时间转化为字符型,无需指定format格式 */
format now_date6 NLDATM20.;
now_date6=input(now_date5,NLDATM20.); /* 字符型时间转化为数值型,需要指定format格式,不指定,为时间戳的格式 */
format datepart yymmdd10.;
datepart=datepart(now_date6);
run;
data linshi02;
format now_date yymmdd10.;
format now_datetime is8601dt20.;
format datep yymmdd10.;
format timep tod8.;
now_date=date(); /* 当天日期 */
/*字符型 */
date1=put(now_date,yymmdd10.);
date2=put(now_date,yymmdd8.);
date4=put(now_date,yymmddn8.); /*不需要写成 compress(put(date,yymmdd10.),'-') */
date5=put(now_date,yymmn6.);
year=put(now_date,year4.);
/*数值型 */
qauter=QTR(now_date);
year2=year(now_date);
month=month(now_date);
week=weekday(now_date);
day=day(now_date);
now_datetime=datetime(); /* 当天时间 */
datep=datepart(now_datetime);
timep=timepart(now_datetime);
run;
运行结果:
还作为工作小白的我,努力地学习,努力地把学习的东西运用到工作中来提升自我价值,最近发现自己整理到本地的资料还是比较零散,所有想着把在工作中积累和学习的经验进行整理和归类,同时记录自己的成长。
以上仅仅是时间变量的在我实际应用中的例子,也许不是最优的方式,如果有疑问或者有更好方法的话,欢迎前来交流。