sql >> Databasteknik >  >> RDS >> Oracle

TO_TIMESTAMP_TZ() Funktion i Oracle

I Oracle Database, TO_TIMESTAMP_TZ() funktion konverterar sitt argument till värdet TIMESTAMP WITH TIME ZONE datatyp.

Syntax

Syntaxen ser ut så här:

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

char argument kan vara vilket uttryck som helst som utvärderas till en teckensträng av CHAR , VARCHAR2 , NCHAR , eller NVARCHAR2 datatyp.

Den valfria fmt argument anger formatet för char . Om du utelämnar fmt , sedan char måste vara i standardformatet för TIMESTAMP WITH TIME ZONE datatyp, som bestäms av NLS_TIMESTAMP_TZ_FORMAT initialiseringsparameter (se Hur du kontrollerar datumformatet för din Oracle-session).

Den valfria 'nlsparam' argument anger det språk som månads- och dagnamn och förkortningar tillhandahålls på. Den har följande form:

'NLS_DATE_LANGUAGE = language'

Exempel

Här är ett grundläggande exempel att visa:

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

Resultat:

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

Formatet på resultatet bestäms av din sessions NLS_TIMESTAMP_TZ_FORMAT parameter. Vi kan kontrollera värdet på NLS_TIMESTAMP_TZ_FORMAT parameter genom att fråga V$NLS_PARAMETERS visa:

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

Resultat:

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

Standardvärdet för NLS_TIMESTAMP_TZ_FORMAT parametern härleds från NLS_TERRITORY parameter. I mitt fall NLS_TERRITORY parametern är AUSTRALIA .

Här är vad som händer när jag ändrar NLS_TERRITORY parametern till ett annat territorium, anrop sedan TO_TIMESTAMP_TZ() igen:

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;

Resultat:

25-AUG-30 06.10.35.123456789 PM +09:30

Den här gången returneras resultatet i ett annat format.

Du kan alternativt ändra värdet på NLS_TIMESTAMP_TZ_FORMAT parameter direkt. Detta kommer att ändra den parametern utan att påverka andra parametrar. Se Hur du ändrar datumformatet i din Oracle-session för mer information och exempel.

Standardformat

I det här exemplet utelämnar jag fmt argument:

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

Resultat:

25-AUG-30 06.10.35.123456789 PM +09:30

När du gör detta måste argumentet vara i standardformatet för TIMESTAMP WITH TIME ZONE datatyp, som bestäms av NLS_TIMESTAMP_TZ_FORMAT parameter.

Här är ett exempel på vad som händer när vi skickar ett värde som inte överensstämmer med detta format:

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

Resultat:

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

I det här fallet skickade jag ett värde som använder 24 timmars tid, men min NLS_TIMESTAMP_TZ_FORMAT parametern anger en 12-timmars klocka med AM/PM-beteckningen.

För att fixa detta måste jag antingen ändra min inmatning eller ändra värdet på NLS_TIMESTAMP_TZ_FORMAT parameter.

Ange ett standardvärde vid konverteringsfel

Du har också möjlighet att ange ett värde som ska returneras i händelse av att det uppstår ett fel när argumentet konverteras till en TIMESTAMP WITH TIME ZONE typ.

Exempel:

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

Resultat:

null

I det här fallet angav jag att null ska returneras när det finns ett konverteringsfel. Returvärdet kan vara ett uttryck eller en bindningsvariabel, och det måste utvärderas till en teckensträng av CHAR , VARCHAR2 , NCHAR , eller NVARCHAR2 datatyp eller null . Funktionen konverterar den sedan till TIMESTAMP WITH TIME ZONE . Om ett fel inträffar under denna konvertering, returneras ett fel.

Angående den första raden i exemplet ovan, är detta helt enkelt för att specificera vad som ska returneras till min klient när en null värde uppstår. Som standard returnerar SQLcl och SQL*Plus ett tomt utrymme när null uppstår som ett resultat av en SQL SELECT påstående.

Du kan dock använda SET NULL för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null bör returneras.

'nlsparam' Argument

Den valfria 'nlsparam' argument anger det språk som månads- och dagnamn och förkortningar tillhandahålls på. Den har följande form:

'NLS_DATE_LANGUAGE = language'

Exempel

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;

Resultat:

25-AUG-30 06.10.35.123456789 PM +02:00

Observera att resultatet fortfarande returneras enligt den aktuella sessionens NLS_TIMESTAMP_TZ_FORMAT parameter. Det är bara ingången var på ett annat språk.

Här är vad som händer när jag ändrar agosto till August samtidigt som du använder samma 'nlsparam' värde:

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;

Resultat:

Error report -
ORA-01843: not a valid month

Detta hände eftersom jag inte angav datumet på språket som anges av 'nlsparam' argument (spanska).

Ändra den till English löser detta 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;

Resultat:

25-AUG-30 06.10.35.123456789 PM +02:00

Se hur du returnerar en lista över språk som stöds i Oracle om det hjälper.

Nollargument

Skickar null resulterar i null :

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

Resultat:

null

Ogiltigt antal argument

Att anropa funktionen utan att skicka några argument resulterar i ett fel:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Resultat:

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

Att skicka för många argument verkar dock inte orsaka några problem, så länge de tre första är giltiga:

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;

Resultat:

25-AUG-30 06.10.35.123456789 PM +09:30

  1. Hur man importerar och exporterar en databas via phpMyAdmin (felet 'Access denied create database db_name')

  2. Hur man visar ett datum som iso 8601-format med PHP

  3. En översikt över PRINT-satsen i SQL Server

  4. Hur man ställer in MariaDB 10.3-replikering med Ansible och Vagrant