合并日期和时间后的差异

时间:2013-01-14 21:42:05

标签: sql sql-server sas

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

我在SQL Server数据库中有这样的日期和时间分割:a1date a1time a2date a2time。我想将a1datea1time合并为一个,a2datea2time合并为两个,并且能够找到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;

1 个答案:

答案 0 :(得分:2)

SAS不使用“强制转换”,除非您处于与SQL Server的直通连接中。 SAS仅对类型转换使用put和input。此外,SAS使用||对于字符串连接,不是+(或CAT *函数 - CATS [strip + cat]和CATX [strip + cat with deliminter]最常见)。此外,您不要将列名括在单引号中 - SAS大多数时候都会平等对待单引号和双引号(主要的例外是宏和宏变量仅在“”not“中解析)。

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 DATETIMEs存储为自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;