2017-04-25 24 views
0

有人可以帮我下面的代码。我正在尝试执行下面列出的任务。是否有可能使用参数解码?使用DECODE功能

DECODE(:START_DATE,NULL,a.issue_date> =(TRUNC(TRUNC(SYSDATE, '月') - 1, '月')),a.issue_date> =:START_DATE) DECODE(:END_DATE, NULL,a.issue_date < =(trunc(sysdate,'MONTH') - 1),a.issue_date < =:END_DATE)

我使用的编程语言是SQL。

+0

究竟是“下面列出的任务”试图做什么? – Donnie

+0

我有两个名为START_DATE和END_DATE的参数。我希望有人输入开始日期和结束日期,以便日期数据在输入的两个参数之间显示。同时,如果参数为空,我希望显示的日期信息为上个月(即。上个月的第一天和最后一天) –

+0

我正在使用Oracle SQL –

回答

0

这是你正在尝试做什么?希望这可以帮助。

select * 
from <table> a 
where a.issue_date between DECODE (:START_DATE, NULL, (trunc(trunc(sysdate,'MONTH')-1,'MONTH')), :START_DATE) 
and DECODE (:END_DATE, NULL, (trunc(sysdate,'MONTH')-1), :END_DATE) 
0

我不认为DECODE在帮助你。它有效,但在我看来,它使代码更难阅读。我认为这是你的两个条件。 (1)与用户输入相比issue_date。 (2)如果用户输入值都为空,则与前一个月的开始和结束的日期值进行比较。此外,使用DECODE可能会使得如果issue_date上有索引,它可能无法使用它。

select * 
from table a 
where (a.issue_date >= :START_DATE and a.issue_date <= :END_DATE) 
    OR (:START_DATE is null AND :END_DATE IS NULL 
     AND a.issue_date >= TRUNC(ADD_MONTHS(SYSDATE,-1),'MONTH') AND a.issue_date < TRUNC(SYSDATE,'MONTH')