0

時間と分に対して 00:00 を返す DHMS 関数。

日付と時刻の入力は Oracle テーブルからのもので、どちらも Number 値です。2 つの値を組み合わせて日時値を作成しようとしています。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;

基本的に、2 つの変数を 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 は「整数の時間数」の引数を取りません。(整数の秒数) または(1960年1 月 1 日 00:00:00 からの整数の 秒数)の引数から、整数の時間数を返します。timedatetime

したがって、この方法で行う場合 (SAS は時間値を整数の秒数として格納し、DHMS は非常に大きな秒数であっても、任意の秒数を取ることができるため、Bob のソリューションははるかに単純です)、次のいずれかを行う必要があります。 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 に答える