конвертировать формат отметки времени в целое число в оракуле - PullRequest
0 голосов
/ 06 июля 2018

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

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

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

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

1 Ответ

0 голосов
/ 06 июля 2018

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

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