SAS编程——关于时间的处理

一、时间常量

数值型变量的时间:

  • 时间:距离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;

其输出结果为:

  • 17
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miya_o00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值