Как работает substr на даты - PullRequest
       7

Как работает substr на даты

0 голосов
/ 24 августа 2018

Я пытаюсь понять запрос в моем приложении, где он использует функцию substr.Я просмотрел документацию для substr , которая выглядит просто и понятно.

Теперь мой запрос без использования substr:

select last_day(to_date(to_char(add_months(TO_DATE('2004/10/25', 'yyyy/mm/dd'),1),'YYYY')||'0201','YYYYMMDD')) from dual;

Это дает мне результат как2/29/2004.Приведенный выше запрос просто возвращает последний день февраля простыми словами.

Теперь я использую substr, как показано ниже:

select substr(last_day(to_date(to_char(add_months(TO_DATE('2004/10/25', 'yyyy/mm/dd'),1),'YYYY')||'0201','YYYYMMDD')),5,1) from dual;

Так что здесь начальное значение равно 5, а длина равна 1,поэтому я ожидаю вывод как 2 глядя на 2/29/2004.но фактический результат - E, мне не ясно, откуда этот E приходит как результат.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Нельзя использовать SUBSTR() для DATE значений. SUBSTR() работает только со строками!

Когда вы запускаете SUBSTR({DATE_VALUE}, ...), Oracle фактически делает следующее:

SELECT 
    SUBSTR(
        TO_CHAR(
            {DATE_VALUE}, (SELECT VALUE FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT') 
        ), ...
    )
FROM dual;

Какова цель этого запроса? Вам нравится выяснять, является ли год ввода високосным?

0 голосов
/ 24 августа 2018

Попробуйте вместо этого -

select substr(to_char(last_day(to_date(to_char(add_months(TO_DATE('2004/10/25', 'yyyy/mm/dd'),1),'YYYY')||'0201','YYYYMMDD')),'dd/mm/yyyy'),5,1)
from dual;
...