Wie bereits erwähnt Sie keine Zeichenfolge von einem String subtrahieren kann. Versuchen
FROM_TZ(min(q.created_date) over (partition by k.car_id,m.fll_id), 'Europe/London') AT TIME ZONE 'America/New_York'
- min(m.act_onblk_datt_bu) over (partition by k.car_id, m.fll_id) AT TIME ZONE 'America/New_York'
Dies gibt eine INTERVAL DAY TO SECOND Data Type
Demo mit Beispieldaten in CTEs, Quer treten die Kürze:
alter session set time_zone = 'America/New_York';
with k (car_id) as (select 1 from dual),
m (fll_id, act_onblk_datt_bu) as (select 1, timestamp '2016-10-30 21:06:34' from dual),
q (created_date) as (select timestamp '2016-10-31 01:08:34' from dual)
select FROM_TZ(min(q.created_date) over (partition by k.car_id,m.fll_id), 'Europe/London') AT TIME ZONE 'America/New_York'
- min(m.act_onblk_datt_bu) over (partition by k.car_id, m.fll_id) AT TIME ZONE 'America/New_York'
from m, k, q;
FROM_TZ(MIN(Q.CREAT
-------------------
+00 00:02:00.000000
Um das Protokoll zu erhalten verwendet EXTRACT(datetime)
Noch ein Hinweis Um Zeitstempel-Differenz zu berechnen, müssen Sie sie nicht in eine gemeinsame Zeitzone umwandeln. Oracle macht es in verschiedenen Zeitzonen richtig.
Einige Update
Sie verwenden EXTRACT
wie folgt aus:
WITH t AS (
SELECT
FROM_TZ(min(q.created_date) over (partition by k.car_id,m.fll_id), 'Europe/London') AT TIME ZONE 'America/New_York'
- min(m.act_onblk_datt_bu) over (partition by k.car_id, m.fll_id) AT TIME ZONE 'America/New_York' AS difference
FROM q, k, m)
SELECT 60*EXTRACT(HOUR FROM difference) + EXTRACT(MINUTE FROM difference)
FROM t;
Der CTE das heißt die WITH t AS
Klausel nur für eine bessere Sichtbarkeit ist. EXTRACT(MINUTE FROM ...)
extrahiert nur den kleinsten Teil des Intervalls, nicht die gesamten Minuten über alles. Sie erwähnen Spalte "Flight_arrival_time", also nehme ich an, dass Sie auch Stunden für Differenz berücksichtigen müssen. Vielleicht müssen Sie sogar 24*60*EXTRACT(DAY FROM difference)
hinzufügen.
Wie ich schon erwähnte, müssen Sie die Zeitzone für Zeitstempelintervalle nicht konvertieren. Vorausgesetzt, Datentyp der Spalte act_onblk_datt_bu
ist TIMESTAMP WITH TIME ZONE
oder TIMESTAMP WITH LOCAL TIME ZONE
Sie es sogar vereinfachen können
WITH t AS (
SELECT
FROM_TZ(min(q.created_date) over (partition by k.car_id,m.fll_id), 'Europe/London')
- min(m.act_onblk_datt_bu) over (partition by k.car_id, m.fll_id) AS difference
FROM q, k, m)
SELECT 60*EXTRACT(HOUR FROM difference) + EXTRACT(MINUTE FROM difference)
FROM t;
das ok aussehen tut, warum das Format anders ist? '30-OCT-2016 21: 08: 34' vs' 30/10/2016 21: 06: 34' –
Sie versuchen, eine Zeichenfolge von einer anderen Zeichenfolge zu subtrahieren ... –
Auch was willst du passieren, wenn die Unterschied ist nicht eine genaue Anzahl von Minuten (also stimmt der Sekundenwert nicht überein), oder ist mehr als 60 Minuten? Es kann hilfreich sein, die gewünschte Ausgabe in verschiedenen Szenarien anzuzeigen, einschließlich des Datentyps, den das Ergebnis haben soll. –