美文网首页
SAS中的时间变量

SAS中的时间变量

作者: Kelly007 | 来源:发表于2019-10-24 14:09 被阅读0次

    不管是在报表自动化还是运营数据自动化中,总会涉及变量,这些变量随着参数的设置,其他相关字段变动或者时间的变动而改变,从而实现数据的动态运转。
    以下为以时间变量为例,分享在使用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;
    

    运行结果:


    image.png image.png

    还作为工作小白的我,努力地学习,努力地把学习的东西运用到工作中来提升自我价值,最近发现自己整理到本地的资料还是比较零散,所有想着把在工作中积累和学习的经验进行整理和归类,同时记录自己的成长。
    以上仅仅是时间变量的在我实际应用中的例子,也许不是最优的方式,如果有疑问或者有更好方法的话,欢迎前来交流。

    相关文章

      网友评论

          本文标题:SAS中的时间变量

          本文链接:https://www.haomeiwen.com/subject/qdhrvctx.html