Вы можете использовать имеющееся у вас значение 118001, разделив его на отдельные разделы года и дня, добавив к номинальной дате начала 1900-01-01 (основываясь на вашем комментарии, что 118001 на самом деле 2018-01-01, а не 2019-01-01):
select date '1900-01-01'
+ floor(118001 / 1000) * interval '1' year
+ (mod(118001, 1000) - 1) * interval '1' day
from dual;
DATE'1900-
----------
2018-01-01
или, запустив фиксированную дату днем ранее, вы можете удалить явное -1:
select date '1899-12-31'
+ floor(118019 / 1000) * interval '1' year
+ mod(118019, 1000) * interval '1' day
from dual;
DATE'1899-
----------
2018-01-19
. Это позволяет избежать создания более длинной строки дляпреобразовать в дату, хотя вы могли бы сделать это (изменив подход @ GMB) следующим образом:
select to_date(to_char(1900 + floor(118001 / 1000)) || '-01-01', 'YYYY-MM-DD')
+ (mod(118001, 1000) - 1)
from dual;
Необходимо указать, по крайней мере, месяц в вызове to_date()
, поскольку Oracle по умолчанию использует текущий месяцесли это не поставляется.Такое поведение скрыто в документации :
Если вы укажете значение даты без компонента времени, тогда временем по умолчанию будет полночь.Если вы укажете значение даты без даты, тогда датой по умолчанию будет первый день текущего месяца.
Первая часть этого достаточно известна и имеет смысл;вторая часть немного менее очевидна и не дает понять, что она применима и к частичным датам - так что, если вы не указали год, используется текущий год;если вы не указали месяц, используется текущий месяц;но если вы не указали день, тогда используется 1-й.
Вы можете увидеть, что он делает, с некоторыми тестовыми конверсиями:
select to_date('2018-12-25', 'YYYY-MM-DD') as demo_a,
to_date('12:34:56', 'HH24:MI:SS') as demo_b,
to_date('2019', 'YYYY') as demo_c,
to_date('07-04', 'MM-DD') as demo_d,
to_date('2019-01', 'YYYY-MM') as demo_e
from dual;
DEMO_A DEMO_B DEMO_C DEMO_D DEMO_E
------------------- ------------------- ------------------- ------------------- -------------------
2018-12-25 00:00:00 2018-12-01 12:34:56 2019-12-01 00:00:00 2018-07-04 00:00:00 2019-01-01 00:00:00