-1

SAS は初めてで、ヘルプ/ガイダンスに感謝します。

SQL Server DB に次のような日付と時刻の分割があります: a1date a1time a2date a2timea1datea1timeを ONE に とa2datea2timeを TWO に組み合わせて、 ONE と TWO の時間差を見つけたいと思います。問題は、変数が Char データ型であり、Numeric データ型に変換する必要があることです。SA​​S がそれを独自の日付形式に変換し、以下のように日付と時刻の両方をマージできないため、diff を行う方法がわかりません。これまでに試した中で失敗したことを 3 つ紹介します。助けていただければ幸いです。

proc sql;
select 
input(substr(strip(AcDate),1,10),MMDDYY10.)as AcDate format mmddyy10. ,
input(substr(strip(AcTime),1,10),Time10.)as AcTime format Time10. ,
input(substr(strip(ConfDate),1,10),MMDDYY10.)as ConfDate format mmddyy10. ,
input(substr(strip(ConfTime),1,10),Time10.)as ConfTime format Time10. ,
AcDate + ' ' + AcTime as Acquired,
ConfDate + ' ' + ConfTime as Confirmed,
DATEDIFF(n, Acquired, Confirmed) AS DifferenceInMinutes,
from TableName;

私も次を使用して失敗しました:(最初は「as」でエラーが発生します)

proc sql;
select
cast(AcDate + ' ' + AcTime AS datetime) AS ‘Acquired’,
cast(ConfDate + ' ' + ComfTime AS datetime) AS ‘Confirmed’,
DATEDIFF(n, Acquired, Confirmed) AS DifferenceInMinutes
FROM tablename

私はこれをいじってみましたが、それを機能させる方法がわかりません。

DATA _null_;
INFORMAT AcDate ConfDate DATE10.
       AcTime ConfTime TIME10.
       unit $10.;
FORMAT dt1 dt2 DATETIME.;
INPUT AcTime time1 date2 time2 unit;
dt1=DHMS(date1,0,0,time1);
dt2=DHMS(date2,0,0,time2);
difference=INTCK(unit,dt1,dt2);
PUT unit= dt1= dt2= difference=;
DATALINES;
4

1 に答える 1

2

SQL Server へのパススルー接続を使用していない限り、SAS は「キャスト」を使用しません。SAS は、型変換専用に put と input を使用します。また、SAS は || を使用します。+ ではなく文字列連結の場合 (または CAT* 関数 - CATS [strip+cat] および CATX [strip+cat with deliminter] が最も一般的)。また、列名を一重引用符で囲みません。ほとんどの場合、SAS は一重引用符と二重引用符を同等に扱います (主な例外はマクロとマクロ変数であり、' ' ではなく " " でのみ解決されます)。

proc sql;
select
cast(AcDate + ' ' + AcTime AS datetime) AS ‘Acquired’,
cast(ConfDate + ' ' + ComfTime AS datetime) AS ‘Confirmed’,
DATEDIFF(n, Acquired, Confirmed) AS DifferenceInMinutes
FROM tablename

なるべき

proc sql;
select
input(catx(' ',AcDate,AcTime),MDYAMPM.) AS Acquired,
input(catx(' ',ConfDate,ComfTime),MDYAMPM.) AS Confirmed,
(calculated Acquired - calculated Confirmed)/60 AS DifferenceInMinutes
FROM tablename

SAS DATETIME は 1960 年 1 月 1 日からの秒数として保存されるため、DATEDIF を実行する最も簡単な方法は、単純に 2 つの日時変数を減算し、分を 60 で割ることです (FLOOR を使用するか CEIL を使用するかはユーザー次第です)。またはROUNDまたは整数の分数にするためのもの)。また、CALCULATED キーワードは、SQL 用語が元のデータセットからではなく、現在のクエリから派生したものであることを SAS に示します。

入力は、実際にはここにあるとおりに機能しない場合があります。DATETIME は通常、SAS では 17JAN2015:15:13:12 の形式で入力されます。ただし、他にもたくさんのオプションがあります。上記のコードに基づいて MDYAMPM を推測しています。mm-dd-yy hh:mm:ss.ss AM|PM の形式で入力します ( http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003172027 .htm ) 日付/時刻の形式が似ていない場合は、いくつかのオプションがあります。

1 つは、最初の sql ステップで行っていたように、日付と時刻を別々に入力することです。次に、DHMS を使用してそれらを結合します。あなたのデータステップは実際には正しいかもしれません - ただし、実際のデータを表示する必要があります。実際に SQL Server テーブルからデータを取得する場合は、DATALINES (コードから直接入力するため) や INPUT ステートメント (そのため、またはテキスト ファイルから入力するため) を使用しません。INPUT関数を使用するだけです。また、データnullはテーブルに保存されません (一時的なものです)。通常、私はテーブルが欲しいです。

これがテストデータセットです。sqltable は SQL テーブルを表しますが、それがどんなに大きくても、適切な名前を付けます (libname.tablename)。

data sqltable;
input acdate $ actime $ CONFDATE $ CONFTIME $;
datalines;
09-02-2012 14:21:05 09-02-2012 16:21:05
;;;;
run;
DATA mydata;
SET sqltable;
UNIT="MINUTE";
format dt1 dt2 DATETIME.;
dt1=DHMS(input(acdate,MMDDYY10.),0,0,input(actime,TIME.));
dt2=DHMS(input(confdate,MMDDYY10.),0,0,input(conftime,TIME.));
difference=INTCK(unit,dt1,dt2); *just fill in Unit with your choice of unit, or do the math directly on the variables as shown earlier;
PUT unit= dt1= dt2= difference=;
run;
于 2013-01-14T22:10:04.760 に答える