2015-06-23 43 views
0

我有一個腳本返回0行以獲得準確的數據。我省略了第6或第7行的腳本。這個腳本有邏輯上不正確的地方嗎?Oracle腳本沒有返回行

1 Select Max (seq_num) 
2 From t_cap_history 
3 Where pr_id_sak = :il_pr_id_sak 
4  And re_unique_id=:locw_re_unique_id 
5  And period_dte = :ll_period_date 
6  AND cap_from_dte = :ll_curr_from_date 
7  And cap_to_dte = :ll_curr_to_date 
8  And capitation_cde = :ls_cap_cde 
+0

你說過忽略第6或7行會導致它返回結果。 A)你的意思是,而不是或? B)鑑於這些日期,你想要做一個完全匹配,或者你想要在一個範圍內的日期?請給出一個省略其中一行的數據示例 – Foon

+0

「cap_from_dte」和「cap_to_dte」列使用哪種數據類型? –

回答

0

深深地凝視我的水晶球......

如果cap_from_dtecap_to_dtedate類型的列,那麼他們將有一天分量和時間分量。即使您的會話未設置爲顯示時間組件,它也會在那裏。您正在進行平等比較,因此:ll_curr_from_date:ll_curr_to_date綁定變量需要完全匹配表中的數據。我猜想你的SQL * Plus會話被設置爲默認情況下不會顯示date值的時間部分,並且導致您爲綁定變量傳遞不正確的值。

假設您的綁定變量是日午夜(默認)的時間成分,你可以使用不平等通常更容易優化器上的日期列使用索引

Select Max (seq_num) 
    From t_cap_history 
Where pr_id_sak = :il_pr_id_sak 
    And re_unique_id=:locw_re_unique_id 
    And period_dte = :ll_period_date 
    AND cap_from_dte >= :ll_curr_from_date 
    AND cap_from_dte < :ll_curr_from_date + 1 
    And cap_to_dte >= :ll_curr_to_date 
    And cap_to_dte < :ll_curr_to_date + 1 
    And capitation_cde = :ls_cap_cde 

,或者你可以使用trunc功能的時間組件設置爲午夜

Select Max (seq_num) 
    From t_cap_history 
Where pr_id_sak = :il_pr_id_sak 
    And re_unique_id=:locw_re_unique_id 
    And period_dte = :ll_period_date 
    AND trunc(cap_from_dte) = :ll_curr_from_date 
    And trunc(cap_to_dte) = :ll_curr_to_date 
    And capitation_cde = :ls_cap_cde 
0

日期範圍,爲什麼不

cap_to_dte >= :ll_curr_from_date AND cap_from_dte <= :ll_curr_to_date