2017-07-19 8 views
1

Ich habe einige Zeitfelder, die INTERVAL TAG (0) bis SECOND (0) Datentypen zu verschiedenen Zeiten des Tages zu speichern sind.Formatierung INTERVALL TAG (0) bis SECOND (0)

Derzeit auf normale Retrieval, meine Felder angezeigt wird als solche:

+00 19: 00: 00,000000

Wie bin ich in der Lage dies so zu formatieren, dass sie als 19.00 Uhr zeigen?

Antwort

0

Im Gegensatz zu documentation kann die Funktion TO_CHAR() für Intervalle nicht verwendet werden. Es erlaubt, INTERVAL-Werte zu verwenden, aber das Ergebnis ist immer dasselbe. An einem anderen Ort der documentation sagt:

Interval Datentypen haben keine Formatmodelle.

können Sie entweder EXTRACT() Funktion oder Sie können mit regulären Ausdrücken arbeiten:

WITH t AS 
    (SELECT INTERVAL '19' HOUR + INTERVAL '30' MINUTE AS i FROM dual) 
SELECT 
    LPAD(EXTRACT(HOUR FROM i), 2, '0')||':'||LPAD(EXTRACT(MINUTE FROM i), 2, '0'), 
    REGEXP_SUBSTR(i, '\d{2}:\d{2}') 
FROM t; 

Normalerweise ist es nicht sehr klug ist Regular Expression auf Datums-/Zeitwerte zu verwenden. Da das Format INTERVAL jedoch nicht von irgendwelchen NLS-Einstellungen abhängig ist, ist es eine machbare Option.

Nachteil von EXTRACT ist, wenn Sie negative Intervalle haben. Solch ein Intervall würde wie -19:-30 geschrieben werden, da jede Komponente mit Minuszeichen (-) zurückgegeben wird. Beachten Sie auch, dass EXTRACTNUMBER Werte zurückgibt, so dass Sie sie manuell mit "0" auffüllen müssen.

+0

Es sollte keine negativen Intervalle geben. Das OP sagte, dass sie diesen Datentyp verwenden **, um verschiedene Tageszeiten zu speichern **. – mathguy

0

Sie möchten Stunden und Minuten von einem Intervall. Wenn das Intervall 24 Stunden nicht überschreiten kann, dann können Sie das Intervall zu einem Datum ohne Zeit Teil hinzufügen und dann TO_CHAR verwenden, um die formatierten Stunden und Minuten zu bekommen:

select to_char(trunc(sysdate) + myinterval, 'hh24:mi') from mytable 

Wenn jedoch kann das Intervall größer sein (zB 100 Stunden und 15 Minuten: 100: 15), dann werden Sie einen anderen Ansatz brauchen:

select 
    to_char(extract (day from myinterval) * 24 + extract (hour from myinterval)) || 
    ':' || 
    to_char(extract (minute from myinterval), 'fm00') 
from mytable 
+0

Das Intervall sollte nicht> = 24 Stunden sein; Das OP sagte, dass sie diesen Datentyp ** verwenden, um verschiedene Tageszeiten zu speichern **. – mathguy

1

Verwenden

substr(to_char(interval_value), 5, 5) 

wo interval_value der Spaltenname ist (Übrigens haben Tabellen in einer relationalen Datenbank keine Felder; sie haben Spalten).

+0

scheint nicht zu funktionieren. Es wirft mich die "String ist zu lang für internen Puffer" Ausnahme – ABB25

+0

@ ABB25 - ** Huh **? Welchen Code verwendest du? Der Fehler stammt NICHT von dem, was ich in meiner Lösung geschrieben habe. – mathguy