SAS中的时间变量

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容