Долгое время для отметки исторических данных (до 1900-х годов) - PullRequest
1 голос
/ 19 мая 2010

У меня есть база данных времени начала и окончания, в которой ранее были достаточно недавние данные (с 1960-х годов до наших дней), которые я смог сохранить как длинные целые числа. Это очень похоже на временные метки Unix, только с точностью до миллисекунды, поэтому такая функция, как java.util.Date.getTime () будет значением текущего времени.

До сих пор это работало хорошо, но мы недавно получили данные 1860-х годов, и следующий код больше не работает, когда значения, которые приводят к временам <1901 (дать или взять): </p>

to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') + numtodsinterval(int_to_convert/(1000),'SECOND' );

Попытка выполнить это со значением в миллисекундах, например -2177452800000, вызывает некоторые проблемы, такие как возвращение даты с отметкой времени в 2038 году. Есть ли способ обойти эту проблему? Вся документация, которую я посмотрел на документацию и временные метки, должна быть в состоянии обрабатывать годы вплоть до -4000 (BC), поэтому я подозреваю, что проблема с numtodsinterval.

Любые предложения идей будут с благодарностью.

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Как насчет этого:

select to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') +
         numtodsinterval(val /(1000*60*60*24),'DAY' ) +
         numtodsinterval(
           ((val /(1000*60*60*24)) - (trunc(val /(1000*60*60*24))) ) * 60*60*24,'SECOND')
from (select -2177452812340 val from dual);

Отделите компонент DAY и добавьте целые дни, затем возьмите остаток и добавьте его с более высокой точностью

0 голосов
/ 19 мая 2010

Как насчет select to_date('01-JAN-1970','DD-MON-YYYY') + ( -1111111111 / (60 * 60 * 24*1000) ) from dual; Это то, что я использую для преобразования Java миллисекунд в даты.

...