Как я могу определить маску формата даты следующего формата даты? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть столбец со следующими датами (пример):

1.5.2018
24.2.2018
6.11.2018
13.10.2018

Может ли формат «ДД.ММ.ГГГГ» обрабатывать его, если в днях или месяцах отсутствует «0»? Если нет: как я могу определить соответствующую маску формата даты?

Ответы [ 2 ]

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

Из документации Oracle по форматным моделям:

FX

Формат точный. Этот модификатор определяет точное соответствие для символьного аргумента и модели формата даты и времени функции TO_DATE:

  • Пунктуация и текст в кавычках в символьном аргументе должны точно соответствовать (кроме регистра) соответствующим частям модели формата.
  • Аргумент символа не может иметь лишних пробелов. Без FX Oracle игнорирует лишние пробелы.
  • Числовые данные в символьном аргументе должны иметь такое же количество цифр, что и соответствующий элемент в модели формата. Без FX числа в символьном аргументе могут опускать ведущие нули.
  • Когда FX включен, вы можете отключить эту проверку для начальных нулей, также используя модификатор FM.

Без модели формата FX :

SELECT TO_DATE( '1.5.2018', 'DD.MM.YYYY' ) AS value FROM DUAL;

Будет работать и выходы (с моей NLS_DATE_FORMAT настройкой):

VALUE
--------------------
2018-05-01T00:00:00Z

и комбинации с дополнительными пробелами:

SELECT TO_DATE( '1 . 5 . 2018', 'DD.MM.YYYY' ) FROM DUAL;

С моделью FX формата :

SELECT TO_DATE( '1.5.2018', 'FXDD.MM.YYYY' ) AS value FROM DUAL;

Дает:

ORA-01862: the numeric value does not match the length of the format item

Указание ведущих нулей будет работать:

SELECT TO_DATE( '01.05.2018', 'FXDD.MM.YYYY' ) FROM DUAL;

VALUE
--------------------
2018-05-01T00:00:00Z

Но добавление лишних пробелов не будет:

SELECT TO_DATE( '01 . 05. 2018', 'FXDD.MM.YYYY' ) FROM DUAL;

ORA-01861: literal does not match format string

Для подавления проверки на ведущие нули вы также можете использовать модель формата FM :

SELECT TO_DATE( '1.5.2018', 'FMFXDD.MM.YYYY' ) FROM DUAL;

Какие выходы:

VALUE
--------------------
2018-05-01T00:00:00Z

Но оператор не будет работать с лишними пробелами

SELECT TO_DATE( '1.5 .2018', 'FMFXDD.MM.YYYY' ) FROM DUAL;

ORA-01861: literal does not match format string
0 голосов
/ 31 августа 2018

Формат 'DD.MM.YYYY' будет работать. Например:

SQL> with yourData(stringDateCol) as (
  2      select '1.5.2018' from dual union all
  3      select '01.05.2018' from dual union all
  4      select '24.2.2018' from dual union all
  5      select '6.11.2018' from dual union all
  6      select '13.10.2018' from dual
  7  )
  8  select to_date( stringDateCol, 'dd.mm.yyyy')
  9  from yourData;

TO_DATE(ST
----------
2018-05-01
2018-05-01
2018-02-24
2018-11-06
2018-10-13

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...