Как использовать to_date для даты вроде '1970-01-01 00: 00: 01.0' - PullRequest
1 голос
/ 27 мая 2019

Я хочу преобразовать текст '1970-01-01 00: 00: 01.0' в дату, используя to_date, но я не понимаю, какой формат я должен использовать.

Если вы проверите несколько примеров, таких как: to_date('1970-01-01 00:00:01', 'гггг-мм-дд HH24: MI: SS'), который работает нормально, но в моем случае я не могу найти такой формат.

Возможнопомогите пожалуйста, какой формат даты мне использовать?

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Вы не можете использовать to_date() со своей строкой в ​​том виде, как она есть, потому что часть .0 представляет миллисекунды - а тип данных даты Oracle не имеет точности в миллисекундах:

select to_date('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS') from dual;

ORA-01830: date format picture ends before converting entire input string

select to_date('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') from dual;

ORA-01821: date format not recognized

Эта ошибка связана с тем, что часть FF модели не применяется к датам.

Вы можете преобразовать в метку времени:

select to_timestamp('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') from dual;

TO_TIMESTAMP('1970-01-0
-----------------------
1970-01-01 00:00:01.000

и затем, если вы действительно хотите, чтобы это было только в качестве даты, приведите ее к дате:

select cast(to_timestamp('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') as date) from dual;

CAST(TO_TIMESTAMP('
-------------------
1970-01-01 00:00:01

Или вы можете использовать строковую манипуляцию для удаления части доли секунды перед использованием to_date(), или , если она всегда будет .0 - без изменений - , вы можете рассматривать это как константу часть модели формата [как уже показано @mathguy].

Также обратите внимание, что имеющееся у вас значение можно рассматривать как литерал метки времени, но только если все это фиксированное значение:

select timestamp '1970-01-01 00:00:01.0' from dual;

TIMESTAMP'1970-01-0100:
-----------------------
1970-01-01 00:00:01.000

и снова вы можете привести его к дате, если необходимо.

2 голосов
/ 27 мая 2019

Вам нужно преобразовать в дату или в метку времени?

Если вам нужно преобразовать в дату и игнорировать дробные секунды, вы можете использовать элемент формата шаблона в модели формата даты.

to_date('1970-01-01 00:00:01.0','yyyy-mm-dd HH24:MI:SS".0"')

Обратите внимание, что я добавил: строку в двойных кавычках, а именно .0.Это замаскирует любую десятичную цифру, а не только 0 (но это должна быть цифра).

Если на некоторых входах может быть больше десятичных разрядов, вы можете развернуть стандартный шаблон, например, до «.000000000». Если есть«слишком много нулей» в модели формата (по сравнению с входными данными), которые будут работать;но если их будет слишком мало, это не так.

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