Oracle
 sql >> Datenbank >  >> RDS >> Oracle

TO_TIMESTAMP_TZ()-Funktion in Oracle

In der Oracle-Datenbank die TO_TIMESTAMP_TZ() Funktion konvertiert ihr Argument in einen Wert von TIMESTAMP WITH TIME ZONE Datentyp.

Syntax

Die Syntax sieht so aus:

TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

Das char Argument kann ein beliebiger Ausdruck sein, der zu einer Zeichenfolge von CHAR ausgewertet wird , VARCHAR2 , NCHAR , oder NVARCHAR2 Datentyp.

Das optionale fmt Argument gibt das Format von char an . Wenn Sie fmt weglassen , dann char muss im Standardformat von TIMESTAMP WITH TIME ZONE vorliegen Datentyp, der durch NLS_TIMESTAMP_TZ_FORMAT bestimmt wird Initialisierungsparameter (siehe So überprüfen Sie das Datumsformat Ihrer Oracle-Sitzung).

Der optionale 'nlsparam' Das Argument gibt die Sprache an, in der Monats- und Tagesnamen und Abkürzungen bereitgestellt werden. Es hat folgende Form:

'NLS_DATE_LANGUAGE = language'

Beispiel

Hier ist ein einfaches Beispiel zur Veranschaulichung:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Ergebnis:

25/AUG/30 06:10:35.123456789 PM +09:30

Das Format des Ergebnisses wird durch den NLS_TIMESTAMP_TZ_FORMAT Ihrer Sitzung bestimmt Parameter. Wir können den Wert von NLS_TIMESTAMP_TZ_FORMAT prüfen Parameter durch Abfrage der V$NLS_PARAMETERS Ansicht:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';

Ergebnis:

DD/MON/RR HH12:MI:SSXFF AM TZR

Der Standardwert von NLS_TIMESTAMP_TZ_FORMAT Der Parameter wird von NLS_TERRITORY abgeleitet Parameter. In meinem Fall der NLS_TERRITORY Parameter ist AUSTRALIA .

Folgendes passiert, wenn ich NLS_TERRITORY ändere Parameter in ein anderes Gebiet, und rufen Sie dann TO_TIMESTAMP_TZ() auf nochmal:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Ergebnis:

25-AUG-30 06.10.35.123456789 PM +09:30

Diesmal wird das Ergebnis in einem anderen Format zurückgegeben.

Alternativ können Sie den Wert von NLS_TIMESTAMP_TZ_FORMAT ändern Parameter direkt. Dadurch wird dieser Parameter geändert, ohne andere Parameter zu beeinflussen. Weitere Informationen und Beispiele finden Sie unter So ändern Sie das Datumsformat in Ihrer Oracle-Sitzung.

Standardformat

In diesem Beispiel lasse ich den fmt weg Argument:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-AUG-30 06.10.35.123456789 PM +09:30'
    )
FROM DUAL;

Ergebnis:

25-AUG-30 06.10.35.123456789 PM +09:30

Dabei muss das Argument im Standardformat von TIMESTAMP WITH TIME ZONE vorliegen Datentyp, der durch NLS_TIMESTAMP_TZ_FORMAT bestimmt wird Parameter.

Hier ist ein Beispiel dafür, was passiert, wenn wir einen Wert übergeben, der nicht diesem Format entspricht:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30'
    )
FROM DUAL;

Ergebnis:

Error report -
ORA-01849: hour must be between 1 and 12

In diesem Fall habe ich einen Wert übergeben, der die 24-Stunden-Zeit verwendet, aber mein NLS_TIMESTAMP_TZ_FORMAT Der Parameter gibt eine 12-Stunden-Uhr mit der Bezeichnung AM/PM an.

Um dies zu beheben, müsste ich entweder meine Eingabe ändern oder den Wert von NLS_TIMESTAMP_TZ_FORMAT ändern Parameter.

Bei Konvertierungsfehler einen Standardwert angeben

Sie haben auch die Möglichkeit, einen Wert anzugeben, der zurückgegeben werden soll, falls beim Konvertieren des Arguments in einen TIMESTAMP WITH TIME ZONE ein Fehler auftritt Typ.

Beispiel:

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(
    'Oops!'
    DEFAULT null ON CONVERSION ERROR
    )
FROM DUAL;

Ergebnis:

null

In diesem Fall habe ich diesen null angegeben sollte zurückgegeben werden, wenn ein Konvertierungsfehler auftritt. Der Rückgabewert kann ein Ausdruck oder eine Bind-Variable sein und muss zu einer Zeichenfolge von CHAR ausgewertet werden , VARCHAR2 , NCHAR , oder NVARCHAR2 Datentyp oder null . Die Funktion wandelt es dann in TIMESTAMP WITH TIME ZONE um . Wenn während dieser Konvertierung ein Fehler auftritt, wird ein Fehler zurückgegeben.

In Bezug auf die erste Zeile im obigen Beispiel dient dies einfach dazu, anzugeben, was an meinen Client zurückgegeben werden soll, wenn ein null ist Wert auftritt. Standardmäßig geben SQLcl und SQL*Plus ein Leerzeichen zurück, wenn null tritt als Ergebnis eines SQL SELECT auf Erklärung.

Sie können jedoch SET NULL verwenden um eine andere Zeichenfolge anzugeben, die zurückgegeben werden soll. Hier habe ich angegeben, dass der String null zurückgegeben werden soll.

Der 'nlsparam' Argument

Der optionale 'nlsparam' Das Argument gibt die Sprache an, in der Monats- und Tagesnamen und Abkürzungen bereitgestellt werden. Es hat folgende Form:

'NLS_DATE_LANGUAGE = language'

Beispiel

SELECT 
    TO_TIMESTAMP_TZ(
        '25-agosto-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Ergebnis:

25-AUG-30 06.10.35.123456789 PM +02:00

Beachten Sie, dass das Ergebnis immer noch gemäß dem NLS_TIMESTAMP_TZ_FORMAT der aktuellen Sitzung zurückgegeben wird Parameter. Es ist nur die Eingabe war in einer anderen Sprache.

Folgendes passiert, wenn ich agosto ändere bis August unter Verwendung desselben 'nlsparam' Wert:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Ergebnis:

Error report -
ORA-01843: not a valid month

Dies geschah, weil ich das Datum nicht in der durch 'nlsparam' angegebenen Sprache angegeben habe Argument (Spanisch).

Ändere es auf English löst dieses Problem:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Ergebnis:

25-AUG-30 06.10.35.123456789 PM +02:00

Siehe So geben Sie eine Liste der unterstützten Sprachen in Oracle zurück, wenn es hilft.

Null-Argumente

Übergabe von null ergibt null :

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(null)
FROM DUAL;

Ergebnis:

null

Ungültige Argumentanzahl

Der Aufruf der Funktion ohne Übergabe von Argumenten führt zu einem Fehler:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Ergebnis:

Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Das Übergeben zu vieler Argumente scheint jedoch keine Probleme zu verursachen, solange die ersten drei gültig sind:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English',
        'Oops!',
        'Dang!',
        'Homer',
        'Symptom'
    )
FROM DUAL;

Ergebnis:

25-AUG-30 06.10.35.123456789 PM +09:30