Как использовать to_date для даты типа «1970-01-01 00:00:01.0»

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

Если вы проверите некоторые примеры, такие как: to_date('1970-01-01 00:00:01','гггг-мм-дд ЧЧ24:МИ:СС') который отлично работает, но в моем случае я не могу найти такой формат.

Не могли бы вы помочь, какой формат даты я должен использовать?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
922
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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(), или если так будет всегда .0 - без изменений -, вы можете рассматривать это как постоянную часть модели формата [как уже показал @mathguy].

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

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

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

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

"без изменений" неверно. «.0» в модели формата будет обрабатывать .9 на входе без проблем. Я уже сказал, что если на входе может быть .309, то «.000000000» в модели формата также справится с этим.

mathguy 27.05.2019 16:38

Хм, да, не уверен, почему это разрешено. Ну, я уже сослался на ваш ответ.

Alex Poole 27.05.2019 16:39

Я был удивлен, когда узнал об этом (экспериментально - кто-то, возможно, тот же постер, возможно, кто-то другой, спросил то же самое в OTN несколько дней назад: community.oracle.com/thread/4270079). Я предполагаю, что Oracle сделал это именно для этого варианта использования!

mathguy 27.05.2019 16:42

Другие вопросы по теме