2015-06-25 32 views
0

真的在这里挠我的脑袋。我有一个具有日期过滤器的查询。但是,我始终得到的结果超出了我的日期过滤期!我检查过我的专栏确实是一个日期专栏,我尝试过使用between和> = < =,这些都没有丝毫影响。SQL难题 - 日期过滤器不起作用

这是我的代码的一个例子。

Declare @PARAM_REPORTING_START_DATE as datetime 
Declare @PARAM_REPORTING_END_DATE as datetime 
Declare @PARAM_CRDTR_ID as integer 


Set @PARAM_REPORTING_START_DATE = '2015/06/12'-- 05:39:44 AM' 
Set @PARAM_REPORTING_END_DATE = '2015/06/24'-- 05:39:44 AM' 
Set @PARAM_CRDTR_ID = 1005 

    --select @PARAM_REPORTING_START_DATE, @PARAM_REPORTING_END_DATE 

    Select distinct 
    capj.cnsmr_accnt_pymnt_jrnl_id, 
    c.cnsmr_nm_prfx_txt, 
    c.cnsmr_nm_frst_txt, 
    c.cnsmr_nm_lst_txt, 
    capj.cnsmr_accnt_pymnt_pstd_dt, 
    isdate(capj.cnsmr_accnt_pymnt_pstd_dt) as is_date, 
    capj.bckt_trnsctn_typ_cd as capj_bckt_trnsctn_typ_cd , 
    pm.pymnt_memo_nm 
    from 
    cnsmr_accnt_pymnt_jrnl capj 
    inner join cnsmr_pymnt_jrnl cpj 
     on capj.cnsmr_pymnt_jrnl_id = cpj.cnsmr_pymnt_jrnl_id 
    inner join pymnt_memo pm 
     on pm.pymnt_memo_id = cpj.pymnt_memo_id 
    inner join crdtr cr 
     on capj.crdtr_id = cr.crdtr_id 
    inner join cnsmr_accnt ca 
     on ca.cnsmr_accnt_id = capj.cnsmr_accnt_id 
    inner join cnsmr c on c.cnsmr_id = ca.cnsmr_id 
Where 
    capj.cnsmr_accnt_pymnt_pstd_dt>[email protected]_REPORTING_START_DATE 
    and 
    capj.cnsmr_accnt_pymnt_pstd_dt<[email protected]_REPORTING_END_DATE 
    and 
    (-1 IN (@PARAM_CRDTR_ID)) OR (cr.crdtr_ID in (@PARAM_CRDTR_ID)) 
+0

OR(cr.crdtr_ID在(@PARAM_CRDTR_ID)) 因此,如果这是真的,其他的where子句都不再重要,必须添加一些额外的错位括号 和 ((-1 IN(@PARAM_CRDTR_ID))OR(crCrdtr_ID in(@PARAM_CRDTR_ID))) – kl78

+0

AND&优先于'OR'。你实际上有'在哪里(A和B和C)或D'而不是'在哪里A和B和(C或D)' –

+0

感谢您的所有答案!非常感谢!很高兴能解决这个问题(即使我觉得自己像一个白痴!) –

回答

1

有括号

Where 
    capj.cnsmr_accnt_pymnt_pstd_dt>[email protected]_REPORTING_START_DATE 
    and 
    capj.cnsmr_accnt_pymnt_pstd_dt<[email protected]_REPORTING_END_DATE 
    and 
    (-1 IN (@PARAM_CRDTR_ID) OR cr.crdtr_ID in (@PARAM_CRDTR_ID)) 
+1

像我的答案,但后来。 – Jodrell

+0

我觉得自己像个白痴!过于忙于专注于过滤器的日期部分,我忽略了第二部分!非常感谢! :-) –

1

你会得到满足

OR (cr.crdtr_ID in (@PARAM_CRDTR_ID)) 

所有结果,这样的日期过滤器没有关系。

您应该重新排列WHERE子句中的括号/括号,例如,

WHERE 
     capj.cnsmr_accnt_pymnt_pstd_dt 
      BETWEEN @PARAM_REPORTING_START_DATE AND @PARAM_REPORTING_END_DATE 
    AND 
     (
      @PARAM_CRDTR_ID = -1 
     OR 
      @PARAM_CRDTR_ID = cr.crdtr_ID 
     );