Преобразовать формат метки времени в целое число в Oracle

У меня есть значение метки времени в формате «01-JAN-00 10.05.54.170489000 AM». Когда я попытался преобразовать в целое число в формате «ггггммддччмм24missff»:

select to_number(to_char(date_column,'yyyymmddhhmm24missff') from table_name;

Я получаю значение 20000101100554170489. Последние 3 цифры отсутствуют. Мне нужно точное значение как 20000101100554170489000.

Как я могу сохранить в своем номере последние три цифры?

Вам нужно закодировать это на Java?

Peter Lawrey 06.07.2018 11:55

В вашем запросе отсутствует закрывающая скобка и есть дополнительный mm, что делает его недействительным. Но с теми поправками, кажется, дает правильный результат. Какую версию Oracle вы используете и на какой платформе?

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

Ответы 1

Ваш запрос (с небольшими исправлениями) получает желаемый результат, когда я запускаю его с простой меткой времени, предоставленной через 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 по-прежнему показывало точность в девять разрядов. Если вы видите все девять при запросе таблицы, это не означает, что значения действительно могут иметь такую ​​высокую точность, и в этом случае последние три отображаемые цифры всегда будут нулями.

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