SAS SQL与Oracle Query不会根据日期返回相同的结果

时间:2012-12-20 13:35:19

标签: sql oracle tsql sas

我希望这个问题有道理。我在SAS中使用SQL来查询Oracle数据库。我也使用SQL Developer。我有一个我知道有效的SQL查询但是当我尝试修改它以在SAS(T / SQL)中工作时,结果是不一样的。

我正在尝试回复那些结束日期在2012年3月之内的广告系列的客户。有谁能告诉我我做错了什么?

工作查询:

select distinct customer_key
from edw.customer_product_fact
where time_key = '31-jan-12'
and campaign_active = 'Y'
and campaign_cd is not null 
and last_day(campaign_end_date) = add_months(time_key,2)

SAS QUERY:

select distinct customer_key
from edw.customer_product_fact
where time_key = '31-jan-12'd
and campaign_active = 'Y'
and campaign_cd is not null
and intnx('month',campaign_end_date, 0, 'end') =intnx('month', time_key, 2, 'end');

我尝试使用dateadd代替intnx,但SAS不支持。

2 个答案:

答案 0 :(得分:2)

我假设显示为 WORKING QUERY 的代码示例是您可以在Oracle工具中运行的,而 SAS QUERY 是您使用{{1>运行的东西(其中EDW指的是先前分配的PROC SQL语句)。在SAS世界中,后一个示例使用“隐式pass-thru”,这意味着您的SAS代码尽可能地被转换为Oracle代码。这就是LIBNAME(Oracle函数)在SAS中不起作用的原因。

如果您习惯编写本机Oracle SQL,您可能会发现使用dateadd的“显式pass-thru”功能更加容易。一个优点是您可以在查询中使用SAS宏变量;它们将在Oracle处理时“扩展”。

换句话说,要创建包含查询结果的名为结果的SAS数据集,请尝试以下操作:

PROC SQL

括号之间的所有内容都完全按照书面形式直接提交给Oracle,这意味着您可以利用任何特定于Oracle的语法。我正在展示如何使用SAS宏变量(& MY_PARM)来说明该功能;你可能不需要它。

答案 1 :(得分:0)

如果我没记错的话,Oracle中存储的日期应始终作为SAS中的日期时间来处理。 尝试将日期更改为日期时间格式,或使用datepart函数从日期时间字段中提取日期部分。

select distinct customer_key
from edw.customer_product_fact
where datepart(time_key) = '31jan12'd
and campaign_active = 'Y'
and campaign_cd is not null
and intnx('month',datepart(campaign_end_date), 0, 'end') =intnx('month', datepart(time_key), 2, 'end');
相关问题