Konvertieren timestamp-Datentyp in unix timestamp, Oracle
Habe ich eine timestamp-Datentyp in Datenbank-format mit 24-JuL-11 10.45.00.000000000 BIN und will es konvertiert Sie in unix-timestamp, wie kann ich es bekommen?
Gibt es keine built-in-Funktionen. Aber es ist relativ einfach zu schreiben
ein. Da ein Unix-timestamp ist die Anzahl der Sekunden seit dem 1. Januar
1970
Subtraktion eines Datums von einem anderen Datum Ergebnisse in der Anzahl der Tage zwischen Ihnen, die Sie tun können, so etwas wie:
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;
Als seine in Sekunden seit 1970 die Zahl der in Bruchteilen von Sekunden, ist dabei unerheblich. Sie können es immer noch mit einem timestamp-Datentyp-obwohl...
Der Wert, den ich leite, um PDate kommt aus $sql = Select TO_DATE(TO_CHAR(fld_from_date, 'DD-Mon-YY HH:MI:SS AM'), 'DD-Mon-YY HH:MI:SS AM') ALS date_for_unix_timestamp) Vorausgesetzt, TO_CHAR(fld_from_date, 'DD-Mon-YY HH:MI:SS AM') in der oben genannten Abfrage-Ergebnisse in '08-Mar-12 01:00:00' , die to_date covesrion dieser char kommt nur '08-Mar-12' , was ist der Grund, HH:MI:SS (01:00:00) wird nicht angezeigt?
Hi @deepti, es gibt keine Notwendigkeit, nach einer anderen Antwort. Sie können immer klicken Sie auf den link Bearbeiten, auf Ihre Frage auf und ändern Sie es dort. Ein Kommentar hinterlässt eine Benachrichtigung, für mich. Ich aktualisiert meine Antwort; der Mangel an Transparenz könnte nur sein, etwas zu tun mit Ihrem Kunden?
Das Studium Zeit und Schaltsekunden ich muss sagen, Ihr programmgesteuerte Lösung ist korrekt, aber die zitierte definition der Unix-Zeit ist nicht: Unix-Zeit ist nicht die Anzahl der Sekunden seit dem 1.1.1970 gewertet, sondern es ist "Die Anzahl der Tage seit dem 1.1.1970 gewertet Zeiten 60 * 60 * 24 plus die Anzahl der Sekunden seit Mitternacht heute!
Ist die Funktion nicht betrachten Sie Ihre aktuelle Zeitzone. Unix-timestamp ist die Anzahl der Sekunden seit dem 1. Januar 1970 00:00:00 UTC. Das Ergebnis ist nur korrekt, wenn Sie Ihre lokale Zeitzone ist UTC.
Merke ich eine Antwort wurde bereits angenommen, aber ich denke, es sollte klar gemacht werden, dass die Funktion in dieser Antwort berücksichtigt nicht die übergebene Datum, Zeitzone offset. Ein richtiger Unix-timestamp berechnet werden sollte, bei der GMT (+0). Oracle to_date Funktion wird die übergebene Datum in der lokalen Zeitzone angezeigt, sofern nicht anders angegeben. Dieses problem wird durch die Tatsache verschärft, dass die Sommerzeit ist eine Reale Sache. Ich kam über dieses problem mit der folgenden Funktion:
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;
Es gibt keinen Grund für dynamisches SQL und SELECT ... INTO FROM dual. NEW_TIME unterstützt nur eine kleine Teilmenge von allen Zeit Zonen, so dass es scheitern kann. Sie schlägt auch dann fehl, wenn die Eingabe der Datums-nicht in der aktuellen Saison, versuchen unix_time_from_date(SYSDATE + 150).
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;
für 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;
Verwende ich folgende Methode, die unterscheidet sich ein wenig von den anderen Antworten, dass es nutzt sessiontimezone() Funktion richtig erhalten Datum
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;
Für die Konvertierung von Oracle -, Zeit-und Unix-Zeiten verwende ich diese Funktionen.
Sie überlegen, Ihre aktuelle Zeitzone. Sollten Sie auch hinzufügen DETERMINISTIC Schlüsselwort, zum Beispiel, wenn Sie wie zu verwenden diese Funktion in ein function-based index. Konvertierung zwischen DATE und TIMESTAMP getan werden sollte implizit durch 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(epoche);END Timestamp2UnixTime;FUNCTION UnixTime2Timestamp(UnixTime IN NUMBER)RETURN TIMESTAMP DETERMINISTIC ISBEGINRETURN(TIMESTAMP '1970-01-01 00:00:00 UTC'+ UnixTime * INTERVAL '1' SECOND) AT LOCAL;END UnixTime2Timestamp;
Dies scheint zu geben Mikrosekunden statt Sekunden.
einige Systeme verwenden Sekunden, andere nutzen Millisekunden. Es sollte ziemlich offensichtlich, wie Sie es ändern.
Die standard-Unix-Zeitstempel in Sekunden seit der Epoche, und die Frage wird nicht darauf hin, dass Abweichungen von diesem standard. Alle anderen Antworten auf diese Frage verwenden Sie Sekunden, nicht Millisekunden (das ist, was ich meinte zu sagen, anstatt Mikrosekunden). Es kann ziemlich klar, wie diese Antwort ändern, aber es ist nicht sofort offensichtlich, dass die Antwort geändert werden muss, um mit zu beginnen.
Es ist immer ratsam, fügen Sie einige Erklärung zu deinem code, vor allem, warum es unterscheidet sich von anderen Antworten, wenn es gibt bereits eine Menge von Ihnen
Diese Frage ist so ziemlich das umgekehrte von Unixtime konvertieren zu Datetime SQL (Oracle)
Als Justin Höhle sagt:
Subtraktion eines Datums von einem anderen Datum Ergebnisse in der Anzahl der Tage zwischen Ihnen, die Sie tun können, so etwas wie:
Als seine in Sekunden seit 1970 die Zahl der in Bruchteilen von Sekunden, ist dabei unerheblich. Sie können es immer noch mit einem timestamp-Datentyp-obwohl...
In Antwort auf Ihren Kommentar, es tut mir Leid, aber ich sehe nicht, dass Verhalten:
Gibt es 3600 Sekunden Unterschied, also 1 Stunde.
Merke ich eine Antwort wurde bereits angenommen, aber ich denke, es sollte klar gemacht werden, dass die Funktion in dieser Antwort berücksichtigt nicht die übergebene Datum, Zeitzone offset. Ein richtiger Unix-timestamp berechnet werden sollte, bei der GMT (+0). Oracle
to_date
Funktion wird die übergebene Datum in der lokalen Zeitzone angezeigt, sofern nicht anders angegeben. Dieses problem wird durch die Tatsache verschärft, dass die Sommerzeit ist eine Reale Sache. Ich kam über dieses problem mit der folgenden Funktion:Habe ich einige Begleiter-Funktionen
unix_time
undunix_time_to_date
, verfügbar unter http://jrfom.com/2012/02/10/oracle-and-unix-timestamps-revisited/. Ich kann nicht glauben, dass Oracle es gemacht hat, den Weg zu 11g-ohne die Umsetzung dieser.SELECT ... INTO FROM dual
. NEW_TIME unterstützt nur eine kleine Teilmenge von allen Zeit Zonen, so dass es scheitern kann. Sie schlägt auch dann fehl, wenn die Eingabe der Datums-nicht in der aktuellen Saison, versuchenunix_time_from_date(SYSDATE + 150)
.Datum:
für timestamp:
Verwende ich folgende Methode, die unterscheidet sich ein wenig von den anderen Antworten, dass es nutzt
sessiontimezone()
Funktion richtig erhalten DatumDas war, was ich kam mit:
FWIW
Für die Konvertierung von Oracle -, Zeit-und Unix-Zeiten verwende ich diese Funktionen.
Sie überlegen, Ihre aktuelle Zeitzone. Sollten Sie auch hinzufügen
DETERMINISTIC
Schlüsselwort, zum Beispiel, wenn Sie wie zu verwenden diese Funktion in ein function-based index. Konvertierung zwischenDATE
undTIMESTAMP
getan werden sollte implizit durch Oracle.