SAS日期时间格式

在SAS里,日期实际存储的是距离1960年1月1日的天数,时间实际存储的是距离凌晨的秒数。
时间日期常量包括日期、时间、日期时间三种形式,命名需要采用单引号或双引号加D(日期)、T(时间)、DT(日期时间)后缀来表示。
日期的输入:加d;
时间的输入:加t;
日期时间的输入:加dt;

代码:

data tmp;
  date='01Jan1960'd;
  time='00:00:00't;
  datetime='01Jan1960 00:00:00'dt;
run;
proc print data=tmp;run;

在这里插入图片描述

SAS日期时间格式-转换

字符型日期转换为数值型
新变量名 = input(需转换日期的变量名,日期格式);
QSDATE = input(QSDAT,yymmdd10.) ;

数值型日期转换字符型格式
新变量名 = compress(put(旧变量名,yymmdd10.))
yymmdd10.格式:yyyy-mm-dd

假设日期为1991年08月28日12:05:05.49。

代码:

data tmp;
  date='28AUG1991'd;
  time='12:05:05.49't;
  datetime='28AUG1991 12:05:05.49'dt;

  date1=compress(put(date,yymmdd10.));
  time1=compress(put(time,time11.2));
  datetime1=compress(put(datetime,datetime20.2));
run;
proc print data=tmp;run;

在这里插入图片描述

获取系统时间

系统日期:date()
系统时间:time();
系统星期:weekday();
The WEEKDAY function produces an integer that represents the day of the week, where 1=Sunday, 2=Monday, …, 7=Saturday.
时区:option timezone=‘Asia/Beijing’;

查看时区:
https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/lesysoptsref/n0dp25ebcqokrfn154de7yfdy9ra.htm

proc format;
  value week
  1 = "Sunday"
  2 = "Monday"
  3 = "Tuseday"
  4 = "Wednesday"
  5 = "Thursday"
  6 = "Friday"
  7 = "Saturday";
run;

option timezone='Asia/Beijing';  
data beijing;
  date = date();
  time = time();
  week = weekday(date);
  format date date10.  time time8. week week.;
run;

proc print data=beijing;
  title "Beijing time";
run;

option timezone='US/Pacific';
data seattle1;
  date = date();
  time = time();
  week = weekday(date);
  format date date10.  time time8. week week.;
run;
proc print data=seattle1;
  title "Seattle time";
run;

在这里插入图片描述

日期时间格式汇总

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
日期时间格式汇总参考“SAS编程技术教程(朱世武)”

两位日期的输出处理

yearcutoff=option 仅影响两位的年份,指定两位年份
例如:
options yearcutoff=1920; 设定了从1920年至2019年,100年的时间跨度
date1=12/07/41 41年在1920年至2019年,100年的时间跨度中,所以41年指1941年
在这里插入图片描述
在这里插入图片描述

计算时间间隔

intick(interval,start,end) 输出结果为数字
intnx(interval,start ,n) 输出结果为日期

intck:区间跨度
weeks:计算中间经历了多少个星期天,不是经历了多少个7天。
Months:计算中间经历过多少个1号。
Years:计算中间经历了过多少个1月1日。

data intck;
	Weeks = intck ('week','31 dec 2000'd,'01jan2001'd); 
	Months = intck ('month','31 dec 2000'd,'01jan2001'd);
	Years = intck ('year','31 dec 2000'd,'01jan2001'd);

	Years1 =intck('year','15jun1999'd,'15jun2001'd);
	Years2=intck('year','01jan2002'd,'31dec2002'd);
	Months1=intck('month','15jun1999'd,'15jun2001'd);
	put _all_;
run;

在这里插入图片描述

Intnx:给定区间,计算具体时间
默认年1月1日
B:beginning开始
M:middle中间
E:end末尾
S:same相同

data intnx;
	TargetYear=intnx('year','05feb94'd,3);
	TargetMonth=intnx('semiyear','01jan2001'd,1);

	MonthX1=intnx('month','01jan95'd,5,'b'); 
	MonthX2=intnx('month','01jan95'd,5,'m'); 
	MonthX3=intnx('month','01jan95'd,5,'e');
	format _all_ yymmdd10.;
	put _all_;
run;

在这里插入图片描述

精确计算时间间隔(年月日时分秒)

合并年月日时分秒
DHMS函数:四个参数,分别是日期、小时、分钟、秒。函数结果为毫秒,除以3600,折算为小时。除以86400,折算天。

  data = input(scan(Last,1," "),yymmdd10.);
  hour = input(scan(scan(Last,-1," "),1,":"),best.);
  min = input(scan(Last,-2,":"),best.);
  sec = input(scan(Last,-1,":"),best.);
  time =round((DHMS(input(scan(Last,1," "),yymmdd10.),input(scan(scan(Last,-1," "),1,":"),best.),
                     input(scan(Last,-2,":"),best.),input(scan(Last,-1,":"),best.))-
               DHMS(input(scan(First,1," "),yymmdd10.),input(scan(scan(First,-1," "),1,":"),best.),
                     input(scan(First,-2,":"),best.),input(scan(First,-1,":"),best.)))/86400,1);

在这里插入图片描述
Last为字符格式日期时间,先切分为数值格式的日期、小时、分钟、秒,然后将数值型的日期、小时、分钟、秒合并。同理计算First。数值型的结果相减,然后将毫秒折算为天数。

日期差值

计算两个日期之间的差值,以年为单位
yrdif(开始日期,结束日期,“计算依据”);

计算两个日期之间的差值,以天为单位
datdif(开始日期,结束日期,“计算依据”);

act:按照每月实际天数计算
30/360:按每月30天计算
act/365:不管当年多少天,都按365天算
在这里插入图片描述

时间函数汇总

在这里插入图片描述

format :显示的样子,不能修改数值,仅修改显示样式。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐