我有一个脚本,返回0行以获得准确的数据。我省略了第6或第7行脚本的工作原理。这个脚本在逻辑上是否有任何错误?
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 :(得分:0)
深深地凝视着我的水晶球......
如果cap_from_dte
和cap_to_dte
是date
类型的列,那么它们将具有日期组件和时间组件。即使您的会话未设置为显示时间组件,它也会在那里。您正在进行相等性比较,因此: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
答案 1 :(得分:0)
对于日期范围,为什么不
cap_to_dte >= :ll_curr_from_date AND cap_from_dte <= :ll_curr_to_date