一、时间常量
数值型变量的时间:
- 时间:距离0:00:00的秒数;
- 日期:距离1960-1-1的天数;
- 日期时间:1960-1-1:0:00:00的秒数;
时间常量:
data _null_;
format dt1 datetime20. dt2 datetime20. dt3 datetime20. dt4 datetime20.
date1 yymmdd10. date2 yymmdd10.
time1 time10. time2 time10. time3 time10.;
dt1 = "22SEP2008 09:08:10"dt;
dt2 = "10JAN2005:08:08:08"dt;
dt3 = 0;
dt4 = 86470;
date1 = "10JAN2005"d;
date2 = 0;
time1 = "08:09:10"t;
time2 = 0;
time3 = 80;
put dt1=; put dt2=; put dt3=; put dt4=;
put date1=; put date2=;
put time1=; put time2=; put time3=;
run;
其输出结果为:
二、常用时间格式
data _null_;
date = date();
date1 = put(date,yymmdd10.); date2 = put(date,yymmdd8.);
date3 = put(date,yymmdd6.); date4 = put(date,yymmddn8.);
yearmonth = put(date,yymmdd6.);
year = put(date,year4.);
dt = "22SEP2008 09:08:10"dt;
dt1 = put(dt,datetime20.);
dt2 = put(dt,is8601dt20.);
dt3 = put(dt,NLDATM30.); *书中举例生成的是"2008年9月22日 09时08分10秒",不知道我的环境差在哪里了~(此处待补充);
time = "08:09:10"t;
time1 = put(time,time8.); *10点前小时数只有一位;
time2 = put(time,tod8.); *小时数始终2位,10点前小时数会补0;
put date=; put date1=; put date2=; put date3=; put date4=;
put yearmonth=; put year=;
put dt=; put dt1=; put dt2=; put dt3=;
put time=; put time1=; put time2=;
run;
其输出结果为:
三、ISO8601格式的时间转换
data _null_;
time = "08:09:10"t;
time8 = put(time,time8.); *10点前小时数只有一位;
tod8 = put(time,tod8.); *小时数始终2位,10点前小时数会补0;
*只保留时和分,不显示秒;
time5 = put(time,time5.); *10点前小时数只有一位;
tod5 = put(time,tod5.); *小时数始终2位,10点前小时数会补0;
date = date(); *只包含日期的数值型变量;
dt = "22SEP2008 09:08:10"dt; *包含日期和时间的数值型变量;
*将日期时间变量转换成ISO8601格式;
date_8601=put(date,is8601da.);
dt_8601=put(dt,is8601dt.);
*将字符型时间变量还原成数值型,基于本程序中的数据,以下两种方式,结果是一样的;
o_date1=input(date_8601,e8601da.);
o_date2=input(date_8601,is8601da.);
o_dt1=input(dt_8601,e8601dt.);
o_dt2=input(dt_8601,is8601dt.);
put time=; put time8=; put tod8=; put time5=;put tod5=; put;
put date=; put date_8601=; put o_date1=; put o_date2=; put;
put dt=; put dt_8601=; put o_dt1=; put o_dt2=;
run;
其输出结果为:
四、常用时间函数
data times;
format date1 yymmdd10. date2 yymmdd10. date3 yymmdd10. datep yymmdd10.
dt1 is8601dt20. dt2 is8601dt20.
timep tod8. time1 tod8. time2 tod8.;
date1 = DATE(); *返回当前日期值,同TODAY();
dt1 = DATETIME(); *返回当前日期时间值;
time1 = TIME(); *返回当前时间值;
dt2 = DHMS('02JAN2009'd,8,13,21); *根据日期、时、分、秒,返回日期时间值;
date2 = MDY(3,21,2009); *根据月、日、年返回日期值;
date3 = YYQ(2009,4); *根据年、季,返回此季度第一天的日期值;
time2 = HMS(12,5,45); *根据时、分、秒,返回时间值;
timep = TIMEPART(dt1); *返回日期时间的日期值;
datep = DATEPART(dt1); *返回日期时间的时间值;
year1 = YEAR(date1); *返回日期的年;
qauter1 = QTR(date1); *返回日期的季度;
month1 = MONTH(date1); *返回日期的月;
day1 = DAY(date1); *返回日期的日;
day2 = WEEKDAY(date1); *返回日期的星期几,1~7为星期日~星期六;
hour1 = HOUR(dt2); *返回日期时间值或时间值的小时;
minute1 = MINUTE(dt2); *返回日期时间值或时间值的分钟;
second1 = SECOND(dt2); *返回日期时间值或时间值的秒;
put date1 =; put date2 =; put date3 =; put datep =;
put dt1 =; put dt2 =;
put timep =; put time1 =; put time2 =;
put year1 =; put qauter1 =; put month1 =;
put day1 =; put day2 =;
put hour1 =; put minute1 =; put second1 =;
run;
其输出结果为:
四、计算两个日期的间隔——INTCK函数
data intervals;
length date1 8 date2 8 type $15 interval 8;
format date1 yymmdd10. date2 yymmdd10.;
retain date1 '02JAN2009'd date2 '25SEP2010'd;
type = 'day'; interval=INTCK(type,date1,date2); output; *间隔的天数;
type = 'weekday'; interval=INTCK(type,date1,date2); output; *间隔的工作日数,出去周六、周日;
type = 'week'; interval=INTCK(type,date1,date2); output; *间隔的周数;
type = 'month'; interval=INTCK(type,date1,date2); output; *间隔的月数;
type = 'qtr'; interval=INTCK(type,date1,date2); output; *间隔的季数;
type = 'year'; interval=INTCK(type,date1,date2); output; *间隔的年数;
run;
其输出结果为: