2016-11-18 4 views
0

Ich versuche, den Unterschied in Minuten zwischen 2 Zeitstempeln zu berechnen, aber ich bekomme Fehler mit der 'ungültigen Nummer' irgendwelche Ideen, warum dies sein könnte?Unterschied in Minuten zwischen 2 Zeitstempeln

Der Code im Versuch, zu laufen, wie folgt:

TO_CHAR(FROM_TZ(min(q.created_date) over (partition by k.car_id,m.fll_id),  'Europe/London') AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI') 
- TO_CHAR(min(m.act_onblk_datt_bu) over (partition by k.car_id, m.fll_id) AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI') * 24 * 60) ||'-mins' as difference 

Wenn ich den Code aufgeteilt und führen diese unabhängig die Ausgabe wie folgt:

TO_CHAR(FROM_TZ(min(q.created_date) over (partition by k.car_id,m.fll_id), 'Europe/London') AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI') as created_time 

30-OCT-2016 21:08:34 


TO_CHAR(min(m.act_onblk_datt_bu) over (partition by k.car_id, m.fll_id) AT TIME ZONE 'America/New_York', 'DD-MON-YYYY HH24:MI') as Flight_arrival_Time 

30/10/2016 21:06:34 

Was ich hoffe, zu tun Es subtrahiert den Unterschied in Minuten zwischen der Spalte 'Erstellte Zeit' und der Spalte 'Flight_arrival_time'

Jede Hilfe wird sehr geschätzt.

+0

das ok aussehen tut, warum das Format anders ist? '30-OCT-2016 21: 08: 34' vs' 30/10/2016 21: 06: 34' –

+1

Sie versuchen, eine Zeichenfolge von einer anderen Zeichenfolge zu subtrahieren ... –

+0

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

Antwort

1

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; 
+0

ich weiß nicht, wie man extract (datetime) mit dieser Abfrage verwendet FROM_TZ (min (q.created_date) über (Partition von k.car_id, m.fll_id), 'Europa/London') AT TIME ZONE 'America/New_York ' - min (m.act_onblk_datt_bu) über (Partition von k.car_id, m.fll_id) AT TIME ZONE' Amerika/New_York ' können Sie mir sagen, wie Sie es bitte einbeziehen? –

+0

Ich habe es geschafft zu erreichen, was ich mit dem folgenden vorgenommen haben: ROUND ((CAST (FROM_TZ ( MIN (q.created_date) OVER (PARTITION BY k.car_id, m.fll_id), ‚Europe/London‘ ) AT ZEITZONE 'Amerika/New_York' AS DATE ) - CAST ( MIN (m.act_onblk_datt_bu) OVER (PARTITION BY k.car_id, m.fll_id) AT ZEITZONE 'America/New_York AS' DATUM )) * 1440 ) AS_Nummer_von_Min, –

+0

Ja, Sie berechnen die Differenz zweier 'DATE' Werte, die eine Anzahl (von Tagen) zurückgeben. Die Differenz von "TIMESTAMP" gibt einen "INTERVAL" -Wert zurück. Grundsätzlich ist es eine Frage des Geschmacks welchen man benutzt. Werfen Sie einen Blick auf [Datetime/Interval Arithmetic] (http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#i48042), um einen Überblick zu erhalten. –

0

Nun Alex Poole bereits ein Verfahren bereitzustellen, das Datum auf das gleiche Format zu setzen. Aber ich habe versucht zu verstehen, was passiert ist und habe diese Probe für dich bekommen.

SQL DEMO

Hier source ist das Ergebnis der Abfrage, TO_DATE beide Zeichenfolge bisher konvertieren mit so in gleichem Format sind, und dann die Differenz berechnen.

ALTER SESSION SET NLS_LANGUAGE="American" 

\\ 
WITH source as (
    SELECT '30-OCT-2016 21:08:34' as A, '30/10/2016 21:06:34' as B 
    FROM Dual 
) 
SELECT TO_DATE(A, 'DD-MON-YYYY HH24:MI:SS') as new_a, 
     TO_DATE(B, 'DD/MM/YYYY HH24:MI:SS') as new_b, 
     ( TO_DATE(A, 'DD-MON-YYYY HH24:MI:SS') 
     - TO_DATE(B, 'DD/MM/YYYY HH24:MI:SS') 
     ) * 24 * 60 as result 
FROM source   

OUTPUT

enter image description here

+0

Basierend auf einer früheren Frage ist der Datentyp TIMESTAMP nicht DATE. So erhalten Sie einen INTERVALL, den Sie mit einer solchen Zahl nicht multiplizieren können. –

+0

@WernfriedDomscheit Nicht sicher, was Sie meinen, OP Query Show Ergebnis kam von 'TO_CHAR()' –

+0

In einer früheren Frage (http: // stackoverflow.com/questions/40676911/date-time-conversion-zwischen-verschiedenen-timezones/40677556) wurde festgestellt, dass der Datentyp von 'created_date'' TIMESTAMP' und nicht 'DATE' ist. –

Verwandte Themen