web-dev-qa-db-fra.com

oracle convertir unix époque à ce jour

Le contexte est qu’il existe une application existante dans notre produit qui génère et envoie le numéro Epoch à une procédure Oracle existante et inversement. Cela fonctionne dans cette procédure en utilisant quelque chose comme ceci 

SELECT UTC_TO_DATE (1463533832) FROM DUAL
SELECT date_to_utc(creation_date) FROM mytable

Lorsque j'ai essayé ces requêtes, cela fonctionne également pour moi avec le serveur Oracle 10g (et le développeur Oracle SQL 4.x si cela compte). 

Dans la procédure existante, l'exigence consistait à enregistrer la valeur sous forme de date elle-même (la composante heure n'était pas pertinente). Toutefois, dans la nouvelle exigence, je dois convertir la valeur d'époque unix en date/heure (au niveau heure/minute/seconde, ou mieux dans un délai spécifique). format tel que jj-MMM-aaaa hh: mm: ss) dans une requête Oracle. Bizarrement, je ne trouve aucune documentation concernant les fonctions UTC_TO_DATE et DATE_TO_UTC avec Google. J'ai examiné toutes les différentes questions sur stackoverflow, mais la plupart d'entre elles sont spécifiques à des langages de programmation tels que php, Java, etc. 

En bout de ligne, comment convertir Epoch à ce niveau de temps en utilisant ces fonctions (ou toute autre fonction) dans une requête Oracle? De plus, ces fonctions auxquelles je fais référence peuvent être personnalisées ou spécifiques quelque part, car je ne vois aucune documentation ou référence à cela.

3
Subhash Dike

Pour convertir des millisecondes à partir de l'époque (supposons que c'est le 1er janvier 1970):

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60 / 1000) * 1322629200000
from dual;

30/11/2011 05:00:00 AM

Pour convertir cette date en millisecondes:

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60 * 1000
from dual;

1322629200000

Si ses secondes au lieu de millisecondes, omettez simplement la partie 1000 de l'équation:

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60 ) * 1322629200
from dual;

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60
from dual;

J'espère que cela pourra aider. 

12
tbone

Une autre option consiste à utiliser un type d'intervalle:

SELECT TO_TIMESTAMP('1970-01-01 00:00:00.0'
                   ,'YYYY-MM-DD HH24:MI:SS.FF'
       ) + NUMTODSINTERVAL(1493963084212/1000, 'SECOND')
FROM dual;

Il a cet avantage que les millisecondes ne seront pas coupées.

3
kpater87

Si votre époque Epoch est stockée sous la forme d'un entier ......__ Et si vous souhaitez la conversion au format de date Oracle. 

Étape 1 -> Ajoutez la date de votre époque (1462086000) à la date du 1er janvier 1970. 86400 est la seconde dans une période de 24 heures.

*Select TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 from dual*  
   **output is 5/1/2016 7:00:00 AM**

Étape 2 -> Convertissez-le en CHAR. Ceci est nécessaire pour le formatage avant que des fonctions supplémentaires ne puissent être appliquées.

  *Select TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss') from dual*

   output is  2016-05-01 07:00:00

Étape 3 -> Maintenant sur la conversion d'horodatage

Select to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') from dual

  output is 5/1/2016 7:00:00.000000000 AM

Étape 4 -> Maintenant besoin du fuseau horaire, utilisation de l'UTC

Select from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  from dual

     output is 5/1/2016 7:00:00.000000000 AM +00:00

Étape 5 -> Si votre fuseau horaire est requis

 Select from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  at time zone 'America/Los_Angeles' TZ from dual

           output is 5/1/2016 12:00:00.000000000 AM -07:00

Étape 6 -> Formater l’horodatage du fuseau horaire PST. 

 Select to_Char(from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  at time zone 'America/Los_Angeles' ,'DD-MON-YYYY HH24:MI:SS') TZ from dual 

          output is  01-MAY-2016 00:00:00

Étape 7 -> Et enfin, si votre colonne est datatype

   Add to_DATE to the whole above Select. 
1
Bashobi

Je pensais que quelqu'un serait intéressé par une version de fonction Oracle:

CREATE OR REPLACE FUNCTION unix_to_date(unix_sec NUMBER)
RETURN date
IS
ret_date DATE;
BEGIN
    ret_date:=TO_DATE('19700101','YYYYMMDD')+( 1/ 24/ 60/ 60)*unix_sec;
    RETURN ret_date;
END;
/

J'avais plusieurs dates pour lesquelles j'avais besoin de dates, alors j'ai mis à jour mon tableau avec:

update bobfirst set entered=unix_to_date(1500000000+a);

où a est un nombre compris entre 1 et 10 000 000.

1
user1683793

La voici pour UTC/GMT et EST;

GMT  select (to_date('1970-01-01 00','yyyy-mm-dd hh24') +
     (1519232926891)/1000/60/60/24) from dual;

EST  select new_time(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
     (1519232926891)/1000/60/60/24, 'GMT', 'EST') from dual;
0
Paul