Oracle - Как преобразовать дату в формате NUMBER (6,0) - PullRequest
0 голосов
/ 02 апреля 2019

Я получил данные от нашего стороннего партнера, и каждый столбец даты закодирован в этом НОМЕР (6,0) формате:

118346
118347
118348
118351
119013
119035
119049
119051
118339
118353
119019
119028
119029
119031

Ни одна из последних 3 цифр не превышает 365, поэтомуЯ считаю, что 118339 должно означать 2018 + 339 дней, то есть 5 декабря 2018 года: '2018-12-05'.Я никогда не сталкивался с таким форматом раньше, поэтому я немного беспомощен, как справиться с этим.Это какой-то стандартизированный формат?Могу ли я использовать какую-то встроенную функцию преобразования или мне нужно просто вырезать и преобразовать ее вручную с помощью некоторой арифметики?

Я бы хотел отсортировать группы строк по неделям, поэтому, возможно, мне даже не следует преобразовывать их, нопо некоторым причинам я считаю, что преобразование в тип даты будет более элегантным.Какой подход лучше?

РЕДАКТИРОВАТЬ: Я только что проверил свою версию данных Excel, и этот формат на самом деле работает, как я себе представлял.Так что вопрос стоит.

1 Ответ

2 голосов
/ 02 апреля 2019

Кажется, что это Внутреннее представление дат в Excel в 1900 году .Предполагая, что ваша интерпретация верна, вы можете преобразовать ее в обычную дату с небольшим количеством манипуляций:

-- CTE for sample values
with your_table (num) as (
  select *
  from table(sys.odcinumberlist(118339, 118346, 118347, 118348, 118351, 119013, 119035,
    119049, 119051, 118339, 118353, 119019, 119028, 119029, 119031))
)
-- actual query
select num,
  date '1899-12-31'
    + floor(num/1000) * interval '1' year
    + mod(num, 1000) * interval '1' day  as converted
from your_table;

       NUM CONVERTED 
---------- ----------
    118339 2018-12-05
    118346 2018-12-12
    118347 2018-12-13
    118348 2018-12-14
    118351 2018-12-17
    119013 2019-01-13
    119035 2019-02-04
    119049 2019-02-18
    119051 2019-02-20
    118339 2018-12-05
    118353 2018-12-19
    119019 2019-01-19
    119028 2019-01-28
    119029 2019-01-29
    119031 2019-01-31

При этом первые три цифры (полученные с floor(num/1000)) рассматриваются как число лет со смещением от 1900Они умножаются на значение интервала в один год, чтобы получить 118 или 199 лет.Затем он обрабатывает последние три цифры - от mod(num, 1000) - как количество дней в этом году путем умножения на интервал одного дня.Затем оба добавляются к фиксированной дате 1899-12-31.(Вы можете использовать 1900-01-01 вместо этого, но тогда вам нужно вычесть день в конце ...)

...