Я использую Oracle 11g.
Итак, у меня есть этот запрос, который дает мне Last Business Day of a Month
(всегда приветствуются любые предложения по улучшению запроса)
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;
Что на сегодняшний день дает мне этот результат
30-APR-2015
Теперь, когда я сравниваю это с sysdate + 9
, чтобы проверить, является ли это концом месяца, он всегда дает мне No Match
- см., что я конвертирую оба в дату, используя 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;
Но если я изменю этот запрос, чтобы преобразовать sysdate + 9
в char
с использованием to_char
, он сработает и даст мне 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;
Я понимаю, что во втором запросе он соответствует strings
и, таким образом, дает мне Match
. Есть ли способ, которым это сравнение дает мне результат Match
без преобразования этого в char
?
Это правда, что это дает мне желаемый результат, но я бы не хотел использовать здесь функцию to_char
.
PS: LAST_BD_OF_MONTH_P
объявляется как 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 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;
DD-MON-RR
, такжеLAST_BD_OF_MONTH_P
объявляется какDate
- person Saagar Elias Jacky   schedule 21.04.2015to_date(sysdate)
бесполезен. Он преобразуетdate
вvarchar
только для того, чтобы снова преобразовать его обратно вdate
. - person a_horse_with_no_name   schedule 21.04.2015to_char(..., 'D')
зависит от текущих настроек NLS_TERRITORY, которые могут меняться в каждом сеансе. - person Wernfried Domscheit   schedule 21.04.2015