sql >> Database >  >> RDS >> Oracle

TO_TIMESTAMP_TZ() Functie in Oracle

In Oracle Database, de TO_TIMESTAMP_TZ() functie converteert zijn argument naar een waarde van TIMESTAMP WITH TIME ZONE gegevenstype.

Syntaxis

De syntaxis gaat als volgt:

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

De char argument kan elke expressie zijn die resulteert in een tekenreeks van CHAR , VARCHAR2 , NCHAR , of NVARCHAR2 gegevenstype.

De optionele fmt argument specificeert het formaat van char . Als u fmt weglaat , dan char moet de standaardindeling hebben van de TIMESTAMP WITH TIME ZONE gegevenstype, dat wordt bepaald door de NLS_TIMESTAMP_TZ_FORMAT initialisatieparameter (zie Het datumformaat van uw Oracle-sessie controleren).

De optionele 'nlsparam' argument specificeert de taal waarin maand- en dagnamen en afkortingen worden gegeven. Het heeft de volgende vorm:

'NLS_DATE_LANGUAGE = language'

Voorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren:

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

Resultaat:

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

Het formaat van het resultaat wordt bepaald door de NLS_TIMESTAMP_TZ_FORMAT van uw sessie parameter. We kunnen de waarde van de NLS_TIMESTAMP_TZ_FORMAT . controleren parameter door de V$NLS_PARAMETERS . op te vragen bekijken:

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

Resultaat:

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

De standaardwaarde van de NLS_TIMESTAMP_TZ_FORMAT parameter is afgeleid van de NLS_TERRITORY parameter. In mijn geval de NLS_TERRITORY parameter is AUSTRALIA .

Dit gebeurt er als ik de NLS_TERRITORY wijzig parameter naar een ander gebied en roep dan TO_TIMESTAMP_TZ() . aan nogmaals:

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;

Resultaat:

25-AUG-30 06.10.35.123456789 PM +09:30

Deze keer wordt het resultaat in een ander formaat geretourneerd.

U kunt ook de waarde van de NLS_TIMESTAMP_TZ_FORMAT . wijzigen parameter direct. Hierdoor wordt die parameter gewijzigd zonder andere parameters te beïnvloeden. Zie Het datumformaat wijzigen in uw Oracle-sessie voor meer informatie en voorbeelden.

Standaardformaat

In dit voorbeeld laat ik de fmt . weg argument:

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

Resultaat:

25-AUG-30 06.10.35.123456789 PM +09:30

Wanneer u dit doet, moet het argument de standaardindeling hebben van de TIMESTAMP WITH TIME ZONE gegevenstype, dat wordt bepaald door de NLS_TIMESTAMP_TZ_FORMAT parameter.

Hier is een voorbeeld van wat er gebeurt als we een waarde doorgeven die niet aan dit formaat voldoet:

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

Resultaat:

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

In dit geval heb ik een waarde doorgegeven die 24 uur gebruikt, maar mijn NLS_TIMESTAMP_TZ_FORMAT parameter specificeert een 12-uursklok met de AM/PM-aanduiding.

Om dit op te lossen, moet ik ofwel mijn invoer wijzigen, of de waarde van de NLS_TIMESTAMP_TZ_FORMAT wijzigen parameter.

Geef een standaardwaarde op bij conversiefout

Je hebt ook de mogelijkheid om een ​​waarde op te geven die moet worden geretourneerd in het geval dat er een fout optreedt tijdens het converteren van het argument naar een TIMESTAMP WITH TIME ZONE typ.

Voorbeeld:

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

Resultaat:

null

In dit geval heb ik gespecificeerd dat null moet worden geretourneerd wanneer er een conversiefout is. De geretourneerde waarde kan een uitdrukking of een bindvariabele zijn en moet resulteren in een tekenreeks van CHAR , VARCHAR2 , NCHAR , of NVARCHAR2 gegevenstype, of null . De functie converteert het vervolgens naar TIMESTAMP WITH TIME ZONE . Als er tijdens deze conversie een fout optreedt, wordt er een fout geretourneerd.

Wat betreft de eerste regel in het bovenstaande voorbeeld, dit is gewoon om aan te geven wat er naar mijn client moet worden geretourneerd wanneer een null waarde optreedt. Standaard retourneren SQLcl en SQL*Plus een spatie wanneer null treedt op als resultaat van een SQL SELECT uitspraak.

U kunt echter SET NULL . gebruiken om een ​​andere tekenreeks op te geven die moet worden geretourneerd. Hier heb ik gespecificeerd dat de string null moet worden geretourneerd.

De 'nlsparam' Argument

De optionele 'nlsparam' argument specificeert de taal waarin maand- en dagnamen en afkortingen worden gegeven. Het heeft de volgende vorm:

'NLS_DATE_LANGUAGE = language'

Voorbeeld

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;

Resultaat:

25-AUG-30 06.10.35.123456789 PM +02:00

Merk op dat het resultaat nog steeds wordt geretourneerd volgens de NLS_TIMESTAMP_TZ_FORMAT van de huidige sessie parameter. Het is alleen dat de invoer was in een andere taal.

Dit gebeurt er als ik agosto verander tot August terwijl je dezelfde 'nlsparam' . gebruikt waarde:

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;

Resultaat:

Error report -
ORA-01843: not a valid month

Dit gebeurde omdat ik de datum niet heb opgegeven in de taal gespecificeerd door de 'nlsparam' argument (Spaans).

Veranderen in English lost dit probleem op:

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;

Resultaat:

25-AUG-30 06.10.35.123456789 PM +02:00

Zie Hoe u een lijst met ondersteunde talen in Oracle kunt retourneren als dit helpt.

Nullargumenten

Doorgeven van null resulteert in null :

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

Resultaat:

null

Ongeldig aantal argumenten

Het aanroepen van de functie zonder het doorgeven van argumenten resulteert in een fout:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Resultaat:

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

Te veel argumenten doorgeven lijkt echter geen problemen te veroorzaken, zolang de eerste drie geldig zijn:

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;

Resultaat:

25-AUG-30 06.10.35.123456789 PM +09:30

  1. Hoe de UCASE()-functie werkt in MySQL

  2. Opgeslagen procedure om dubbele records in SQL-tabel te verwijderen

  3. Hoe SHOW COLLATION werkt in MariaDB

  4. Hostingpakket op Chocolatey