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
答案 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.))
等