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;