两个日期之间的SQL查询,即使日期不在两者之间


select ktl.id, kth.trans_dte, kth.trtype, kp.match_code,ktl.net_amount,ktl.gross_amount,ktl.db_portfolio_type,ktl.cr_portfolio_type from k$transaction_lines ktl 
    left join k$transaction_header kth on ktl.id=kth.id 
    left join k$portfolio kp on kp.id = (CASE WHEN ktl.db_portfolio_type = 'C' THEN ktl.db_portfolio ELSE ktl.cr_portfolio END) 
    where to_char(kth.trans_dte,'DD-MON-YY') >= '22-AUG-16' 
    and to_char(kth.trans_dte,'DD-MON-YY') <= '27-AUG-16'
    and ktl.db_portfolio_type <> 'I' 
    and ktl.cr_portfolio is not null 
    order by  kth.trans_dte, ktl.id, kp.match_code, kth.trtype

这是我的查询。我只是想知道我的where子句kth.trans_dte是否有问题。我只想获得8月22日至8月27日的交易,但如果我在该日期之前获得交易,则包括2月和3月。我想知道为什么……我的代码有问题,还是我不知道的数据库有问题。谢谢!

使用to_char将字段转换为char,然后尝试按日期比较它。To_char确实做到了它所说的——转换成一个char字符串,这样你就可以根据字符串

的ASCII表示得到日期。

尝试使用to_date代替-在条件的两边

尝试使用BETWEEN代替2个条件

select ktl.id, kth.trans_dte, kth.trtype, kp.match_code,ktl.net_amount,ktl.gross_amount,ktl.db_portfolio_type,ktl.cr_portfolio_type from k$transaction_lines ktl 
    left join k$transaction_header kth on ktl.id=kth.id 
    left join k$portfolio kp on kp.id = (CASE WHEN ktl.db_portfolio_type = 'C' THEN ktl.db_portfolio ELSE ktl.cr_portfolio END) 
    where (to_char(kth.trans_dte,'DD-MON-YY') >= '22-AUG-16' 
    and to_char(kth.trans_dte,'DD-MON-YY') <= '27-AUG-16')
    and ktl.db_portfolio_type <> 'I' 
    and ktl.cr_portfolio is not null 
    order by  kth.trans_dte, ktl.id, kp.match_code, kth.trtype

试试这个。

尝试在查询中使用between关键字和to_date函数

where kth.trans_dte between to_date('22-AUG-16') 
and to_date('27-AUG-16')
and ktl.db_portfolio_type <> 'I' 
and ktl.cr_portfolio is not null 
order by  kth.trans_dte, ktl.id, kp.match_code, kth.trtype

对不起,我刚刚解决了。我不能使用to_char当做这个条件,这就是为什么它给出错误的结果。

最新更新