¿Итак, каковы индексы месяца для формата DATE?
Суть вопроса ошибочна, поскольку DATE
не имеет формата, поскольку она хранится внутри как 7 байт (соответственно: век, год века, месяц, день месяца, час, минута и секунда), поэтому универсального строкового представления типа данных DATE
не существует.
Функция SUBSTR( string, start_character, length )
принимает:
- Строка в качестве первого аргумента;
- Начальным индексом подстроки является второй аргумент и первый символ в строке имеют индекс 1 (а не 0); и
- Длина возвращаемой подстроки в качестве третьего аргумента.
Итак, первые ошибки состоят в том, что, если вы принимаете формат DD-MM-RR
и хотите 2- длинная символьная подстрока, начинающаяся с 4-го символа строки, затем 2-й и 3-й аргументы должны быть 4, 2
, а не 3, 5
.
Первое, что Oracle сделает, когда вы передадите DATE
в качестве первого аргумента нужно попытаться неявно преобразовать DATE
в строку, и ваш вызов функции будет эффективным:
SUBSTR(
TO_CHAR(
fecha_dev,
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
),
4,
2
)
Значение по умолчанию NLS_DATE_FORMAT
зависит от NLS_TERRITORY
настройки, чтобы вы не получали согласованное значение между пользователями в разных частях света (т. е. в Испании по умолчанию установлено значение DD/MM/RR
, тогда как в Америке это DD-MON-RR
, а месяц отображается в виде символов, а в Швеции - * 1040). * и получение 4-го и 5-го символов дало бы в прошлом году ди git и дефис).
Даже если все ваши пользователи находятся на одной территории, нет гарантии, что они не будут устанавливать свои собственные Параметры ssion, так как любой пользователь может выполнить команду, чтобы изменить свой сеанс, чтобы изменить его. Например:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD HH24MISS MONRR';
(и, да, этот формат даты используется в некоторых настройках)
Таким образом, вы никогда не должны полагаться на неявное преобразование дат в строки, так как вы не можете быть уверены, что получите согласованный формат.
Если вы хотите использовать SUBSTR
, вам следует явно преобразовать дату в строку и указать модель формата:
WHERE SUBSTR( TO_CHAR( fecha_dev, 'DD-MM-RR' ), 4, 2 ) IN ( '05' )
Однако, если вы собираетесь это сделать, вы можете просто пропустить SUBSTR
и просто вывести месяц:
WHERE TO_CHAR( fecha_dev, 'MM' ) = '05'
Или вы можете использовать EXTRACT
:
WHERE EXTRACT( MONTH FROM fecha_dev ) = 5