DHMS功能在00:00返回小时和分钟

时间:2012-11-23 16:40:07

标签: sas

DHMS功能在00:00返回小时和分钟。

我的日期和时间输入来自Oracle表,两者都是数字值。 我正在尝试将这两个值组合起来创建一个日期时间值。 我可以创建一个Auth_DT(DDMONYYYY)和一个Auth_Tm(HH:MM:SS)。 当我尝试使用DHMS创建验证日期时间时,小时和分钟显示为00:00, 但秒是正确的。

我感谢您对我的代码中的错误提供任何帮助 预先感谢您的任何帮助。

data dates;
Auth_Date = 20120915; 
Auth_Time = 23324; 
run;

Proc SQL;
Create table mark as 
Select 
AUTH_DATE, 
input(put(AUTH_DATE,8.),yymmdd8.) as AUTH_DT format=Date9. ,
AUTH_TIME, 
input(put(AUTH_TIME,6.),hhmmss6.) as AUTH_TM format=TOD8. ,
Input(Substr( put(Auth_Time,z6.),1,2),2.) as HR ,
Input(Substr( put(Auth_Time,z6.),3,2),2.) as MIN , 
Input(Substr( put(Auth_Time,z6.),5,2),2.) as SEC ,
DHMS((input(put(AUTH_DATE,8.),yymmdd8.))  
,HOUR(Input(Substr( put(Auth_Time,z6.),1,2),2.)) 
,MINUTE(Input(Substr( put(Auth_Time,z6.),3,2),2.)) 
,SECOND(Input(Substr( put(Auth_Time,z6.),5,2),2.))) as Auth_DTTM Format = datetime20. 
From work.Dates;
Quit;

Auth_Date AUTH_DT Auth_Time AUTH_TM HR MIN SEC Auth_DTTM 20120915 15SEP2012 23324 02:33:24 2 33 24 15SEP2012:00:00:24

2 个答案:

答案 0 :(得分:4)

如果不深入研究您的SQL代码,可能会做您想做的事情:

data _null_;

   Auth_Date = 20120915; 
   Auth_Time = 23324; 

   /* Convert variables to SAS format */
   Auth_Date_SAS = input(put(Auth_Date,z8.),yymmdd8.);
   Auth_Time_SAS = input(put(Auth_Time,z6.),hhmmss6.);

   /* Build timestamp */
   Auth_Date_SAS_Timestamp = DHMS(Auth_Date_SAS,0,0,Auth_Time_SAS);

   put Auth_Date_SAS_Timestamp= datetime.;
run;

基本上,您需要将两个变量转换为SAS格式。 “技巧”是指定时间值作为DHMS函数的最后一个参数。 See the last example in the documentation

答案 1 :(得分:1)

Bob的答案是正确的解决方法,IMO。为了具体回答你的解决方案错误的原因,这是对HOUR函数使用了错误的参数:

HOUR(Input(Substr( put(Auth_Time,z6.),1,2),2.))

那给你,2:33:24,

HOUR(INPUT(SUBSTR('023324',1,2),2.))

所以HOUR(INPUT('02',2.))或者最后是HOUR(2);

然而,小时并未采用“整数小时数”的论证。 time的参数(整数秒)或datetime(自1/1 / 1以来的整数秒)返回整数小时1960 00:00:00)。

所以如果你这样做(同样,Bob的解决方案要简单得多,因为SAS将时间值存储为整数秒,DHMS可以花费任意秒数,甚至是非常大的秒数),你或者需要删除HOUR功能,所以

DHMS(<date part>,input(substr(put(auth_time,z6.),1,2),2.),
     input(substr(put(auth_time,z6.),3,2),2.),
     input(substr(put(auth_time,z6.),5,2),2.)));

或者使用完整的时间参数(即,您在AUTH_TM中存储的确切内容)和HOUR / MINUTE / SECOND函数,即

HOUR(input(put(AUTH_TIME,6.),hhmmss6.))