-1

SAS 新手,感谢一些帮助/指导。

我在 SQL Server DB 中有这样的日期和时间拆分:a1date a1time a2date a2time。我想将a1dateanda1time合并到 ONE 和a2dateanda2time合并到 TWO 中,并且能够找到 ONE 和 TWO 之间的时间差异。问题是变量是 Char 数据类型,需要转换为数字数据类型,我很困惑如何进行差异,因为 SAS 将其转换为自己的日期格式,然后无法合并日期和时间,如下所示。以下是我迄今为止尝试过的三种不同的方法,但均未成功。我真的很感激任何帮助。

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

SAS 不使用“强制转换”,除非您与 SQL Server 建立直通连接。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 的最简单方法是简单地减去两个日期时间变量并除以 60 分钟(如果您想使用 FLOOR 或 CEIL,这取决于您或 ROUND 或诸如此类的东西,使其成为整数分钟数)。此外,CALCULATED 关键字向 SAS 指示 SQL 术语源自当前查询,而不是源自原始数据集。

输入可能与您在此处的实际工作方式不同。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 ) 如果这与您的日期/时间格式不同,您有多种选择。

一种是按照您在第一个 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 回答