Я хочу преобразовать текст «1970-01-01 00:00:01.0» в дату с помощью to_date, но я не понимаю, какой формат использовать.
Если вы проверите некоторые примеры, такие как: to_date('1970-01-01 00:00:01','гггг-мм-дд ЧЧ24:МИ:СС') который отлично работает, но в моем случае я не могу найти такой формат.
Не могли бы вы помочь, какой формат даты я должен использовать?
Вам нужно преобразовать в дату или в отметку времени?
Если вам нужно преобразовать в дату и игнорировать дробные секунды, вы можете использовать шаблонный элемент формата в модели формата даты.
to_date('1970-01-01 00:00:01.0','yyyy-mm-dd HH24:MI:SS".0"')
Обратите внимание, что я добавил: строку в кавычках двойной, а именно .0
. Это замаскирует любую десятичную цифру, а не только 0 (но это должна быть цифра).
Если некоторые входные данные могут иметь больше десятичных знаков, вы можете расширить шаблонный текст, например, до «.000000000». Если в модели формата «слишком много нулей» (по сравнению с входными данными), это будет работать; но если их слишком мало, этого не будет.
Вы не можете использовать 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()
, или если так будет всегда , вы можете рассматривать это как постоянную часть модели формата [как уже показал @mathguy]..0
- без изменений -
Также обратите внимание, что значение, которое у вас есть, может рассматриваться как литерал временной метки, но только если все это является фиксированным значением:
select timestamp '1970-01-01 00:00:01.0' from dual;
TIMESTAMP'1970-01-0100:
-----------------------
1970-01-01 00:00:01.000
и снова вы можете привязать это к дате, если это необходимо.
Хм, да, не уверен, почему это разрешено. Ну, я уже сослался на ваш ответ.
Я был удивлен, когда узнал об этом (экспериментально - кто-то, возможно, тот же постер, возможно, кто-то другой, спросил то же самое в OTN несколько дней назад: community.oracle.com/thread/4270079). Я предполагаю, что Oracle сделал это именно для этого варианта использования!
"без изменений" неверно. «.0» в модели формата будет обрабатывать .9 на входе без проблем. Я уже сказал, что если на входе может быть .309, то «.000000000» в модели формата также справится с этим.