Timestamp de conversion de type de données dans le timestamp unix, Oracle
J'ai un type de données timestamp dans la base de données avec le format 24-Juil-11 10.45.00.000000000 SUIS et que vous souhaitez obtenir pour le transformer en timestamp unix, comment puis-je l'obtenir?
Il n'y a pas de fonctions intégrées. Mais il est relativement facile d'écrire
un. Depuis un timestamp Unix est le nombre de secondes depuis le 1er janvier
1970
Que la suppression des deux dates les uns des autres résultats dans le nombre de jours entre eux, vous pouvez faire quelque chose comme:
createor replace function date_to_unix_ts( PDate in date )return number is
l_unix_ts number;begin
l_unix_ts :=( PDate - date '1970-01-01')*60*60*24;return l_unix_ts;end;
Son secondes depuis 1970, le nombre de fractions de secondes, est sans importance. Vous pouvez toujours l'appeler avec un horodatage de données de type si...
Il y a 3600 secondes de différence, c'est à dire 1 heure.
La valeur de je suis passant à une mise à jour vient d' $sql = Select TO_DATE(TO_CHAR(fld_from_date, 'DD-Mon-YY HH:MI:SS AM'), 'DD-Mon-YY HH:MI:SS AM') date_for_unix_timestamp) en Supposant que TO_CHAR(fld_from_date, 'DD-Mon-YY HH:MI:SS AM') au-dessus des résultats de la requête dans '08-mars-12 01:00:00' , le to_date covesrion de ce char vient tout '08-Mar-12' , ce qui est la raison HH:MI:SS (01:00:00 AM) n'apparaît pas? Salut @deepti, il n'y a pas besoin de poster une autre réponse. Vous pouvez toujours cliquer sur le lien "modifier" sur votre question et changer là-bas. Un commentaire laisse une notification pour moi aussi. J'ai mis à jour ma réponse; le manque de visibilité pourrait juste être quelque chose à faire avec votre client? L'étude du temps et des secondes intercalaires je dois dire que votre solution de programmation est correcte, mais la cité de la définition de Temps Unix n'est pas: le Temps Unix n'est pas le Nombre de Secondes depuis le 1.1.1970, mais il est "Le Nombre de Jours écoulés depuis le 1.1.1970 fois 60 * 60 * 24 plus le Nombre de secondes depuis Minuit aujourd'hui!
Je réalise une réponse a déjà été accepté, mais je pense qu'il devrait être clair que la fonction de cette réponse ne considère pas le passé en date du décalage horaire. Un bon timestamp Unix doit être calculé à l'heure GMT+0). Oracle to_date fonction suppose le passé en date est dans le fuseau horaire local, sauf indication contraire. Ce problème est exacerbé par le fait que l'Heure d'été est une chose réelle. J'ai survécu à ce problème avec la fonction suivante:
createor replace
function unix_time_from_date
(
in_date in date,
in_src_tz in varchar2 default'America/New_York')return integer
as
ut integer :=0;
tz varchar2(8):='';
tz_date timestamp with time zone;
tz_stmt varchar2(255);begin/**
* This function is used to convert an Oracle DATE (local timezone) to a Unix timestamp (UTC).
*
* @author James Sumners
* @date 01 February 2012
*
* @param in_date An Oracle DATE to convert. It is assumed that this date will be in the local timezone.
* @param in_src_tz Indicates the time zone of the in_date parameter.
*
* @return integer
*/-- Get the current timezone abbreviation (stupid DST)
tz_stmt :='select systimestamp at time zone '''|| in_src_tz ||''' from dual';execute immediate tz_stmt into tz_date;select
extract(timezone_abbr from tz_date)into tz
from dual;-- Get the Unix timestampselect(new_time(in_date, tz,'GMT')- to_date('01-JAN-1970','DD-MM-YYYY'))*(86400)into ut
from dual;return ut;end unix_time_from_date;
FUNCTION date_to_unix (p_date date,in_src_tz in varchar2 default'Europe/Kiev')return number isbeginreturn round((cast((FROM_TZ(CAST(p_date as timestamp), in_src_tz) at time zone 'GMT')as date)-TO_DATE('01.01.1970','dd.mm.yyyy'))*(24*60*60));end;
pour timestamp:
FUNCTION timestamp_to_unix (p_time timestamp,in_src_tz in varchar2 default'Europe/Kiev')return number isbeginreturn round((cast((FROM_TZ(p_time, in_src_tz) at time zone 'GMT')as date)-TO_DATE('01.01.1970','dd.mm.yyyy'))*(24*60*60));end;
Je suis en utilisant la méthode suivante, qui diffère un peu des autres réponses en ce qu'il utilise sessiontimezone() fonction de bien obtenir la date
select(
cast((FROM_TZ(CAST(in_date as timestamp), sessiontimezone) at time zone 'GMT')as date)-- in_date cast do GMT-
TO_DATE('01.01.1970','dd.mm.yyyy')-- minus unix start date)*86400000-- times miliseconds in dayfrom dual;
Pour la conversion entre Oracle de temps et d'Unix fois je utiliser ces fonctions.
Ils considèrent votre fuseau horaire actuel. Vous devez également ajouter DETERMINISTIC mot-clé, par exemple si vous souhaitez utiliser cette fonction dans une fonction d'index de base. La Conversion entre les DATE et TIMESTAMP doit être fait de façon implicite par Oracle.
FUNCTION Timestamp2UnixTime(theTimestamp IN TIMESTAMP, timezone IN VARCHAR2 DEFAULT SESSIONTIMEZONE)RETURN NUMBER DETERMINISTIC IS
timestampUTC TIMESTAMP;
theInterval INTERVAL DAY(9)TO SECOND;
epoche NUMBER;BEGIN
timestampUTC := FROM_TZ(theTimestamp, timezone) AT TIME ZONE 'UTC';
theInterval := TO_DSINTERVAL(timestampUTC - TIMESTAMP '1970-01-01 00:00:00');
epoche := EXTRACT(DAY FROM theInterval)*24*60*60+ EXTRACT(HOUR FROM theInterval)*60*60+ EXTRACT(MINUTE FROM theInterval)*60+ EXTRACT(SECOND FROM theInterval);RETURN ROUND(1000*epoche);END Timestamp2UnixTime;FUNCTION UnixTime2Timestamp(UnixTime IN NUMBER)RETURN TIMESTAMP DETERMINISTIC ISBEGINRETURN(TIMESTAMP '1970-01-01 00:00:00 UTC'+ UnixTime/1000* INTERVAL '1' SECOND) AT LOCAL;END UnixTime2Timestamp;
Il est toujours conseillé d'ajouter quelques explications de votre code, et surtout pourquoi il diffère des autres réponses, si il y a déjà beaucoup d'entre eux ne prend pas en compte les années bissextiles, les secondes intercalaires
Cette question est à peu près l'inverse de Convertir Unixtime de type Datetime de SQL (Oracle)
Comme Justin Grotte dit:
Que la suppression des deux dates les uns des autres résultats dans le nombre de jours entre eux, vous pouvez faire quelque chose comme:
Son secondes depuis 1970, le nombre de fractions de secondes, est sans importance. Vous pouvez toujours l'appeler avec un horodatage de données de type si...
En réponse à votre commentaire, je suis désolé mais je ne vois pas ce comportement:
Il y a 3600 secondes de différence, c'est à dire 1 heure.
Salut @deepti, il n'y a pas besoin de poster une autre réponse. Vous pouvez toujours cliquer sur le lien "modifier" sur votre question et changer là-bas. Un commentaire laisse une notification pour moi aussi. J'ai mis à jour ma réponse; le manque de visibilité pourrait juste être quelque chose à faire avec votre client?
L'étude du temps et des secondes intercalaires je dois dire que votre solution de programmation est correcte, mais la cité de la définition de Temps Unix n'est pas: le Temps Unix n'est pas le Nombre de Secondes depuis le 1.1.1970, mais il est "Le Nombre de Jours écoulés depuis le 1.1.1970 fois 60 * 60 * 24 plus le Nombre de secondes depuis Minuit aujourd'hui!
OriginalL'auteur Ben
Je réalise une réponse a déjà été accepté, mais je pense qu'il devrait être clair que la fonction de cette réponse ne considère pas le passé en date du décalage horaire. Un bon timestamp Unix doit être calculé à l'heure GMT+0). Oracle
to_date
fonction suppose le passé en date est dans le fuseau horaire local, sauf indication contraire. Ce problème est exacerbé par le fait que l'Heure d'été est une chose réelle. J'ai survécu à ce problème avec la fonction suivante:J'ai quelques compagnon fonctions,
unix_time
etunix_time_to_date
, disponible à l' http://jrfom.com/2012/02/10/oracle-and-unix-timestamps-revisited/. Je ne peux pas croire que Oracle a fait tout le chemin à 11g sans la mise en œuvre de ces.OriginalL'auteur James Sumners
pour date:
pour timestamp:
OriginalL'auteur Andre Kirpitch
Je suis en utilisant la méthode suivante, qui diffère un peu des autres réponses en ce qu'il utilise
sessiontimezone()
fonction de bien obtenir la dateOriginalL'auteur dpedro
C'est ce que je suis venu avec:
FWIW
OriginalL'auteur rogerdpack
OriginalL'auteur Piotr R
Pour la conversion entre Oracle de temps et d'Unix fois je utiliser ces fonctions.
Ils considèrent votre fuseau horaire actuel. Vous devez également ajouter
DETERMINISTIC
mot-clé, par exemple si vous souhaitez utiliser cette fonction dans une fonction d'index de base. La Conversion entre lesDATE
etTIMESTAMP
doit être fait de façon implicite par Oracle.OriginalL'auteur Wernfried Domscheit
ne prend pas en compte les années bissextiles, les secondes intercalaires
OriginalL'auteur user5193849