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