2017-04-17 119 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),而不是日期的功能,否則無論使用顯式直通或禁用隱直通。在數據庫之間進行日期函數是具有挑戰性的,因此儘可能避免使用日期函數。