2017-04-17 221 views
0

有一个包含以下其他字段的大表: ID,effective_date,Expiration_date。proc SQL语句的where子句中的日期范围

expiration_date是datetime20。格式,并且可以为NULL

我试图提取2014年12月31日后过期的行或不过期(NULL)的行。

添加WHERE语句的PROC SQL查询没有给我结果

where coalesce(datepart(expiration_date),input('31/Dec/2020',date11.)) 
> input('31/Dec/2014',date11.); 

然而,当我只选择NULL到期日期,并添加以下字段如下:

put(coalesce(datepart(expiration_date),input('31/Dec/2020',date11.)),date11.) as value, 
put(input('31/Dec/2014',date11.),date11.) as threshold, 
case when coalesce(datepart(expiration_date),input('31/Dec/2020',date11.)) > input('31/Dec/2014',date11.) 
    then 'pass' else 'fail' end as tag 

这表明“通过“标签下,所有其他领域是正确的。

这是重复我在SQL Server

where isnull(expiration_date,'9999-12-31') > '2014-12-31' 

使用SAS Enterprise Guide中使用7.1的努力,而试图弄明白我一直在使用

proc sql inobs=100;` 

我是什么做错了?谢谢。

一些截止日期:

30OCT2015:00:00:00 
30OCT2015:00:00:00 
29OCT2015:00:00:00 
30OCT2015:00:00:00 
+0

几个指针。你不需要在那里使用'输入';你可以使用日期常量。 ''31DEC2014“d'是一个日期常量,并直接表示日期。其次,看到“value”和“threshold”的值会很有帮助。第三,如果你将数据带入SAS(带有select)然后应用相同的过滤器会发生什么?传递查询中可能有某些内容被错误翻译。 – Joe

+0

另外 - 我假设你连接到SQL Server来运行此查询?如果你是,并且你正在使用'libname'来连接,试着在libname中添加'DIRECT_SQL = NONE'(参见http://support.sas.com/documentation/cdl/en/acreldb/63647/HTML/default /viewer.htm#a002679005.htm),看看是否能解决问题 - 如果是这样的话,我会回答这个问题。 – Joe

+0

使用“31DEC2014”d解决了问题。我很好奇为什么。 – Ben

回答

2

我会建议使用日期不变(“31DEC2014” d),而不是日期的功能,否则无论使用显式直通或禁用隐直通。在数据库之间进行日期函数是具有挑战性的,因此尽可能避免使用日期函数。