2017-04-17 8 views
0

の句は、他の分野の中で、次を含む大きなテーブルがある場合の範囲です。日付のproc SQL文

EXPIRATION_DATEはdatetime20です。私は2014年12月31日後に期限が切れるか(NULL)を期限切れにしない行を抽出しようとしている

フォーマット、およびNULLにすることができます。

のprocのSQL​​クエリを次のようにどこ文は私が唯一のNULL有効期限を選択して、次のフィールドを追加するときに、しかし、私には結果

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

を与えない追加:

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 

それは 'を示していますTAGの下に「合格」と入力してください。

これは私がSAS Enterprise Guideの7.1を使用し、それを理解しようとしているときに、私は私が何を

proc sql inobs=100;` 

を使用してきたSQL Serverで

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

を使用したもの複製するための努力であります間違っている?ありがとうございました。

いくつかの有効期限:

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

ポインタのカップル。そこに 'input'を使う必要はありません。日付定数を使用することができます。 '' 31DEC2014 "d"は日付定数で、日付を直接表します。第二に、 'value'と' threshold'の値を見ることは役に立ちます。第3に、データをSASに読み込んで(選択して)、同じフィルタを適用するとどうなりますか?パススルークエリで何かが誤って翻訳されている可能性があります。 – 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)、または他のいずれかを使用することをお勧めしますが、明示的なパススルーを使用するか、または暗黙のパススルーを無効にします。日付関数はデータベース間を移動するときには困難なので、可能なときは避けるのが最適です。