2010-05-18 10 views
1

J'ai une base de données des heures de début et de fin qui ont déjà toutes eu des données assez récentes (des années 1960 à nos jours) que j'ai pu stocker comme entiers longs. Ceci est très similaire à un horodatage unix, seulement avec une précision d'une milliseconde, donc une fonction comme java.util.Date.getTime() serait la valeur de l'heure actuelle.Long de l'horodatage pour les données historiques (pré-1900)

Cela a bien fonctionné jusqu'à présent, mais nous avons récemment obtenu des données à partir des années 1860, et le code suivant ne fonctionne plus lorsque des valeurs qui donnent lieu à l'époque < 1901 (plus ou moins):

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

essayer cette avec une valeur en millisecondes telle que -2177452800000 provoque certains problèmes, tels que renvoyer la date avec un horodatage en l'an 2038. Existe-t-il un moyen de contourner ce problème? Toute la documentation que j'ai consultée sur la documentation et les horodatages devrait être capable de gérer des années jusqu'à -4000 (BC), donc je suspecte un problème avec le numtodsinterval.

Toutes suggestions d'idées seraient grandement appréciées.

Répondre

1

Que diriez-vous quelque chose comme ceci:

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); 

séparer le composant DAY et ajoutez les journées entières, puis prendre le reste et ajouter que, à la plus grande précision

+0

Merci pour cette réponse! Cela me donne les informations d'horodatage correctes. Toujours curieux de savoir pourquoi l'autre façon n'a pas fonctionné, mais merci encore. – Mike

+0

Juste pour suivre, je recevais quelques différences de temps et a fini par enlever la deuxième addition de numtodsinterval qui m'a donné la bonne réponse: retourner à_timestamp ('1-JAN-1970 00:00:00', 'dd-mon- aaaa hh24: mi: ss '+ numtodsinterval (val/(1000 * 60 * 60 * 24),' JOUR '); Le problème de précision dans la réponse ci-dessous peut avoir été causé par "to_date" au lieu de "to_timestamp". – Mike

0

Que diriez-vous de select to_date('01-JAN-1970','DD-MON-YYYY') + (-1111111111/(60 * 60 * 24*1000)) from dual; C'est ce que j'utilise pour convertir les millisecondes Java en dates.

+0

Le « int_to_convert » est en millisecondes depuis Le 1er janvier 1970. en divisant par 60 * 60^24 perd toute la précision dont j'ai besoin pour conserver. int_to_convert est le nombre en millisecondes stocké dans ma base de données, et je veux juste un moyen d'afficher ces valeurs longues comme des horodatages qui fonctionneront également pour les valeurs antérieures à 1900. – Mike