I am using Oracle 11g.
So, I have this query, which provides me with the Last Business Day of a Month
(any suggestions for a better query is always welcome)
select DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY'))
into LAST_BD_OF_MONTH_P
from dual;
Which as of today gives me this result
30-APR-2015
Now, when I compare this with sysdate + 9
to check whether its End of Month, its always giving me a No Match
- see that I am converting both to date using to_date
.
select to_char(sysdate + 9,'DD-MON-YYYY')
, DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY')) as EOMBD
, case when to_date(sysdate + 9,'DD-MON-YYYY') =
to_date(DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY')), 'DD-MON-YYYY')
then 'Match'
else 'No Match'
end as Match
from dual;
But, if I change this query to convert sysdate + 9
as char
using to_char
, it works and gives me a Match
.
select to_char(sysdate + 9,'DD-MON-YYYY')
, DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY')) as EOMBD
, case when /*convert using to_char*/to_char(sysdate + 9,'DD-MON-YYYY') =
DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY'))
then 'Match'
else 'No Match'
end as Match
from dual;
I understand that in the second query, it matching to strings
and thus giving me a Match
. Is there any way, this comparison provides me a result of Match
without converting this to char
?
Its true that this gives me the desired output, but I would like not to use the to_char
function here.
PS : LAST_BD_OF_MONTH_P
is declared as DATE
INCLUDED ANSWER
select to_char(sysdate + 9,'DD-MON-YYYY'), DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY')) as EOMBD
, case when trunc(sysdate + 9) =
to_date(DECODE(to_char(last_day(to_date(sysdate)), 'D'),'7',
to_char((last_day(sysdate) - 1), 'DD-MON-YYYY'),'1',
to_char((last_day(sysdate) - 2), 'DD-MON-YYYY'),
to_char(last_day(sysdate), 'DD-MON-YYYY')), 'DD-MON-YYYY')
then 'Match'
else 'No Match'
end as Match
from dual;