如何传递日期参数在临时(工作)表中查询?

问题描述 投票:0回答:1

我写了一些关于日期的 sas 变量。我还编写了一段代码

inc_mails
,其中我查询数据库(使用直通),以及另一段代码,其中我使用临时表(工作)将
inc_mails
限制为上个月。当我将
start_sas_month
end_sas_month
参数传递给 temp 并运行它时,会出现语法错误(错误 22-322:语法错误)。我不知道出了什么问题。

我的代码如下:

%let n_months = 1;

%let date = %sysfunc(date());

%let start_month = %sysfunc(intnx(month, &date., -&n_months.));
%let start_sas_month = %str(%')%sysfunc(putn(&start_month., date9.))%str(%'); %put &start_sas_month.;

%let end_month =  %sysfunc(intnx(day, %sysfunc(intnx(month, &date., 1-&n_months., b)), -1, s));
%let end_sas_month = %str(%')%sysfunc(putn(&end_month., date9.))%str(%'); %put &end_sas_month.;


proc sql;
connect to oracle as xyz (authdomain="XYZ_READ" path=XYZ_P);
create table work.inc_mails as 
select * from connection to xyz

(   
    SELECT 
    ap.Id,
    ap.Completed_Date

    FROM xy.Appointments ap
); 

disconnect from xyz;
Quit;


proc sql;
CREATE TABLE final_tbl AS
SELECT
i.Id,
i.Completed_Date

FROM work.inc_mails i

WHERE 
i.Completed_Date >= &start_sas_month.
AND i.Completed_Date <= &end_sas_month.
;
quit;

上面只是我真实代码的一个简短示例。

我希望获得正确的结果,而不会返回受 sas 日期限制的数据集。

sas 4gl
1个回答
0
投票

您的代码很可能存在两个问题。

首先,您可以通过如下比较将 COMPLETED_DATE 视为包含字符串:

Completed_Date >= '01FEB2024'

因此,如果 COMPLETED_DATE 是一个字符串,则不会出现任何语法错误,但比较字符串时,如果“02JAN2024”位于“01FEB2024”之后,则比较将无法正常进行。

如果您想将 COMPLETED_DATE 视为具有 DATE 值,则需要添加字母 D 以便与日期值进行比较。

Completed_Date >= '01FEB2024'd

或者只使用 SAS 用来存储该日期的实际整数值(您存储在不同的宏变量中)。

Completed_Date >= 23407

另一个问题是ORACLE一般没有DATE变量类型。仅 DATETIME 变量类型。因此,当您将 ORACLE 数据库中的数据提取到 SAS 数据集时,COMPLETED_DATE 变量可能会变成 DATETIME 值(自 1960 年以来的秒数)而不是 DATE 值(自 1960 年以来的天数)。

您可以使用 DATEPART() 函数从秒数中提取天数。

WHERE datepart(i.Completed_Date) between &start_month and &end_month
© www.soinside.com 2019 - 2024. All rights reserved.