0

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

4

2 回答 2

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函数的最后一个参数。 请参阅文档中的最后一个示例

于 2012-11-23T17:17:42.360 回答
1

鲍勃的回答是解决这个问题的正确方法,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)

但是,HOUR 不接受“整数小时数”的参数。它从(整数秒数)或(自 1/1/1960 00:00:00 以来的整数 秒数)的参数返回整数小时数。timedatetime

因此,如果您要这样做(同样,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.))

等等

于 2012-11-24T13:31:52.127 回答