PROC SQL:按日期删除行,格式为e8601dt

时间:2016-03-01 15:20:25

标签: sql date sas

从数据集中删除行时遇到一些问题。它们需要通过日期条件删除,但变量在e8601dt中。格式。我注意到有关变量的一件事是它是一个数字类型变量,但是左对齐(不确定它是否具有相关性),所以我尝试子串,并尝试一些额外的尝试(下面)......没有成功 -

PROC SQL;
DELETE *
FROM DATASETS.BATCH_REPORT
WHERE datepart(BATCH_DATE) > '2015-10-01'
;
QUIT; 

PROC SQL;
DELETE *
FROM DATASETS.BATCH_REPORT
WHERE BATCH_DATE > '11oct2015'd
;
QUIT; 

假设必须有一种简单的方法来调用这种格式的值...或者我需要将此变量转换为更易合格的格式,然后进行处理吗?

2 个答案:

答案 0 :(得分:1)

你关闭了!日期转换是系统之间的痛苦。值的表示取决于环境配置。

在proc SQL中,我认为你必须指定oracle函数(而不是SAS datepart)看起来你已经发现Oracle的日期'数据类型将日期和时间存储在相同的值中。 DATE数据类型存储年份(包括世纪),月份,日期,小时,分钟和秒(午夜之后)。 SAS有两种不同的日期类型:日期和日期时间。

我建议使用oracle to_date()函数与字符日期进行比较,即

WHERE BATCH_DATE > to_date('2015-10-01','yyyy-mm-dd')

如果需要,可以使用oracle to_char(BATCH_DATE,' mm-dd-yyyy')将日期变量强制转换为文本值,然后比较文本值。但是你放弃了一些比较能力。

....由于有关......的新信息而编辑... db2 .....: - )

我的方式不是DB2的人,但也许是这样的?

首先,将日期设置为:(传递给DB2的日期需要双引号):

 CALL SYMPUT('INT_DATE',"'"||PUT(sas_date,YYMMDDD10.)||"'");

然后在SQL中使用:

PROC SQL ;

WHERE   BATCH_DATE >= &INT_DATE

https://communities.sas.com/t5/SAS-Procedures/DB2-Date9-format-To-SAS-Serial-Date/td-p/32436

答案 1 :(得分:1)

好的......做了一些研究。显然(如果我错了,请纠正我)...使用e8601dt。格式,日期值需要乘以86400,然后您可以应用格式。所以......除以86400就把我带回了整数的SAS数据。这就是诀窍:

PROC SQL;
DELETE *
FROM SETS
WHERE ID >= 20372
;
QUIT;