У меня есть значение метки времени в формате «01-JAN-00 10.05.54.170489000 AM». Когда я попытался преобразовать в целое число в формате «ггггммддччмм24missff»:
select to_number(to_char(date_column,'yyyymmddhhmm24missff') from table_name;
Я получаю значение 20000101100554170489. Последние 3 цифры отсутствуют. Мне нужно точное значение как 20000101100554170489000.
Как я могу сохранить в своем номере последние три цифры?
В вашем запросе отсутствует закрывающая скобка и есть дополнительный mm, что делает его недействительным. Но с теми поправками, кажется, дает правильный результат. Какую версию Oracle вы используете и на какой платформе?


Ваш запрос (с небольшими исправлениями) получает желаемый результат, когда я запускаю его с простой меткой времени, предоставленной через CTE:
set numwidth 23
alter session set nls_timestamp_format = 'DD-MON-RR HH:MI:SS.FF AM';
with table_name (date_column) as (
select to_timestamp('01-JAN-00 10.05.54.170489000 AM', 'DD-MON-RR HH:MI:SS.FF AM')
from dual
)
select date_column, to_number(to_char(date_column,'yyyymmddhh24missff')) as result
from table_name;
DATE_COLUMN RESULT
------------------------------- -----------------------
01-JAN-00 10:05:54.170489000 AM 20000101100554170489000
Единственный способ, которым я могу получить результат, который у вас действительно есть, - это если ваш столбец с меткой времени действительно ограничен этой точностью; то есть date_column timestamp(6):
with table_name (date_column) as (
select cast(to_timestamp('01-JAN-00 10.05.54.170489000 AM', 'DD-MON-RR HH:MI:SS.FF AM')
as timestamp(6))
from dual
)
select date_column, to_number(to_char(date_column,'yyyymmddhh24missff')) as result
from table_name;
DATE_COLUMN RESULT
------------------------------- -----------------------
01-JAN-00 10:05:54.170489000 AM 20000101100554170489
Кажется странным хотеть показать большую точность, чем фактически разрешенное значение, но если вы действительно хотите всегда включать эти последние три нуля, вы можете переопределить точность столбца, используя ff9:
with table_name (date_column) as (
select cast(to_timestamp('01-JAN-00 10.05.54.170489000 AM', 'DD-MON-RR HH:MI:SS.FF AM')
as timestamp(6))
from dual
)
select date_column, to_number(to_char(date_column,'yyyymmddhh24missff9')) as result
from table_name;
DATE_COLUMN RESULT
------------------------------- -----------------------
01-JAN-00 10:05:54.170489000 AM 20000101100554170489000
Отметка времени (или дата) не имеет внутреннего формата, вы просто видите, как ваш клиент преобразует ее в строку, вероятно, на основе настроек NLS вашего сеанса. Я запустил alter session, чтобы соответствовать тому, что вы, кажется, используете. Обратите внимание, что даже когда я ограничил тип данных timestamp(6), форматирование клиента по умолчанию с использованием ff по-прежнему показывало точность в девять разрядов. Если вы видите все девять при запросе таблицы, это не означает, что значения действительно могут иметь такую высокую точность, и в этом случае последние три отображаемые цифры всегда будут нулями.
Вам нужно закодировать это на Java?