sql >> Database teknologi >  >> RDS >> Oracle

TO_TIMESTAMP_TZ() Funktion i Oracle

I Oracle Database er TO_TIMESTAMP_TZ() funktion konverterer sit argument til en værdi på TIMESTAMP WITH TIME ZONE datatype.

Syntaks

Syntaksen ser sådan ud:

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

char argument kan være ethvert udtryk, der evalueres til en tegnstreng af CHAR , VARCHAR2 , NCHAR eller NVARCHAR2 datatype.

Den valgfri fmt argument angiver formatet for char . Hvis du udelader fmt , derefter char skal være i standardformatet TIMESTAMP WITH TIME ZONE datatype, som bestemmes af NLS_TIMESTAMP_TZ_FORMAT initialiseringsparameter (se Sådan kontrolleres datoformatet for din Oracle-session).

Den valgfrie 'nlsparam' argument angiver det sprog, som måneds- og dagnavne og forkortelser angives på. Det har følgende form:

'NLS_DATE_LANGUAGE = language'

Eksempel

Her er et grundlæggende eksempel for at demonstrere:

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 bestemmes af din sessions NLS_TIMESTAMP_TZ_FORMAT parameter. Vi kan kontrollere værdien af ​​NLS_TIMESTAMP_TZ_FORMAT parameter ved at forespørge på V$NLS_PARAMETERS se:

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

Resultat:

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

Standardværdien for NLS_TIMESTAMP_TZ_FORMAT parameteren er afledt af NLS_TERRITORY parameter. I mit tilfælde NLS_TERRITORY parameteren er AUSTRALIA .

Her er, hvad der sker, når jeg ændrer NLS_TERRITORY parameter til et andet område, kald derefter 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

Denne gang returneres resultatet i et andet format.

Du kan alternativt ændre værdien af ​​NLS_TIMESTAMP_TZ_FORMAT parameter direkte. Dette vil ændre denne parameter uden at påvirke andre parametre. Se Sådan ændres datoformatet i din Oracle-session for flere oplysninger og eksempler.

Standardformat

I dette eksempel udelader jeg 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 dette, skal argumentet være i standardformatet TIMESTAMP WITH TIME ZONE datatype, som bestemmes af NLS_TIMESTAMP_TZ_FORMAT parameter.

Her er et eksempel på, hvad der sker, når vi sender en værdi, der ikke er i overensstemmelse med dette 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 dette tilfælde har jeg givet en værdi, der bruger 24 timers tid, men min NLS_TIMESTAMP_TZ_FORMAT parameter angiver et 12-timers ur med AM/PM-designatoren.

For at rette op på dette skal jeg enten ændre mit input eller ændre værdien af ​​NLS_TIMESTAMP_TZ_FORMAT parameter.

Angiv en standardværdi ved konverteringsfejl

Du har også mulighed for at angive en værdi, der skal returneres i tilfælde af, at der er en fejl under konvertering af argumentet til et TIMESTAMP WITH TIME ZONE type.

Eksempel:

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

Resultat:

null

I dette tilfælde specificerede jeg at null skal returneres, når der er en konverteringsfejl. Returværdien kan være et udtryk eller en bindevariabel, og den skal evalueres til en tegnstreng af CHAR , VARCHAR2 , NCHAR eller NVARCHAR2 datatype eller null . Funktionen konverterer den derefter til TIMESTAMP WITH TIME ZONE . Hvis der opstår en fejl under denne konvertering, returneres en fejl.

Med hensyn til den første linje i ovenstående eksempel er dette blot for at specificere, hvad der skal returneres til min klient, når en null værdi opstår. Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når null opstår som et resultat af en SQL SELECT udmelding.

Du kan dog bruge SET NULL for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null skal returneres.

'nlsparam' Argument

Den valgfrie 'nlsparam' argument angiver det sprog, som måneds- og dagnavne og forkortelser angives på. Det har følgende form:

'NLS_DATE_LANGUAGE = language'

Eksempel

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

Bemærk, at resultatet stadig returneres i henhold til den aktuelle sessions NLS_TIMESTAMP_TZ_FORMAT parameter. Det er bare, at input var på et andet sprog.

Her er, hvad der sker, når jeg ændrer agosto til August mens du bruger den samme 'nlsparam' værdi:

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

Dette skete, fordi jeg ikke angav datoen på det sprog, der er angivet af 'nlsparam' argument (spansk).

Ændrer det til English løser dette 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, hvordan du returnerer en liste over understøttede sprog i Oracle, hvis det hjælper.

Nul-argumenter

Sender null resulterer i null :

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

Resultat:

null

Ugyldigt antal argumenter

Kaldning af funktionen uden at sende nogen argumenter resulterer i en fejl:

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"

Det ser dog ikke ud til at give nogen problemer, hvis de første tre er gyldige:

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. Hvorfor kan kun en superbruger OPRET UDVIDELSE hstore, men ikke på Heroku?

  2. Oprettelse af en Oracle Database 12c – Trin for trin

  3. ORA-12519 TNS:ingen passende servicehandler fundet

  4. Java SQLData - Cast til brugerobjekt med en liste/array?