sql >> Databáze >  >> RDS >> Oracle

Funkce TO_TIMESTAMP_TZ() v Oracle

V databázi Oracle je to TO_TIMESTAMP_TZ() funkce převede svůj argument na hodnotu TIMESTAMP WITH TIME ZONE datový typ.

Syntaxe

Syntaxe vypadá takto:

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

char argument může být jakýkoli výraz, který se vyhodnotí jako znakový řetězec CHAR , VARCHAR2 , NCHAR nebo NVARCHAR2 datový typ.

Volitelné fmt argument určuje formát char . Pokud vynecháte fmt a poté char musí být ve výchozím formátu TIMESTAMP WITH TIME ZONE datový typ, který je určen NLS_TIMESTAMP_TZ_FORMAT inicializační parametr (viz Jak zkontrolovat formát data vaší Oracle Session).

Volitelný 'nlsparam' argument určuje jazyk, ve kterém jsou poskytovány názvy měsíců a dnů a zkratky. Má následující podobu:

'NLS_DATE_LANGUAGE = language'

Příklad

Zde je základní příklad k demonstraci:

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

Výsledek:

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

Formát výsledku je určen NLS_TIMESTAMP_TZ_FORMAT vaší relace parametr. Můžeme zkontrolovat hodnotu NLS_TIMESTAMP_TZ_FORMAT dotazem na V$NLS_PARAMETERS zobrazit:

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

Výsledek:

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

Výchozí hodnota NLS_TIMESTAMP_TZ_FORMAT parametr je odvozen z NLS_TERRITORY parametr. V mém případě NLS_TERRITORY parametr je AUSTRALIA .

Zde je to, co se stane, když změním NLS_TERRITORY parametr do jiné oblasti, pak zavolejte TO_TIMESTAMP_TZ() znovu:

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;

Výsledek:

25-AUG-30 06.10.35.123456789 PM +09:30

Tentokrát je výsledek vrácen v jiném formátu.

Alternativně můžete změnit hodnotu NLS_TIMESTAMP_TZ_FORMAT parametr přímo. Tím se tento parametr změní, aniž by to ovlivnilo ostatní parametry. Další informace a příklady naleznete v části Jak změnit formát data v aplikaci Oracle Session.

Výchozí formát

V tomto příkladu vynechám fmt argument:

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

Výsledek:

25-AUG-30 06.10.35.123456789 PM +09:30

Když to uděláte, argument musí být ve výchozím formátu TIMESTAMP WITH TIME ZONE datový typ, který je určen NLS_TIMESTAMP_TZ_FORMAT parametr.

Zde je příklad toho, co se stane, když předáme hodnotu, která neodpovídá tomuto formátu:

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

Výsledek:

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

V tomto případě jsem předal hodnotu, která používá 24hodinový čas, ale můj NLS_TIMESTAMP_TZ_FORMAT parametr určuje 12hodinový čas s označením AM/PM.

Abych to napravil, musel bych buď změnit svůj vstup, nebo změnit hodnotu NLS_TIMESTAMP_TZ_FORMAT parametr.

Zadejte výchozí hodnotu při chybě převodu

Máte také možnost zadat hodnotu, která se vrátí v případě, že dojde k chybě při převodu argumentu na TIMESTAMP WITH TIME ZONE typ.

Příklad:

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

Výsledek:

null

V tomto případě jsem uvedl, že null by měl být vrácen vždy, když dojde k chybě převodu. Vrácená hodnota může být výraz nebo proměnná vazby a musí se vyhodnotit jako řetězec znaků CHAR , VARCHAR2 , NCHAR nebo NVARCHAR2 datový typ nebo null . Funkce jej poté převede na TIMESTAMP WITH TIME ZONE . Pokud během převodu dojde k chybě, vrátí se chyba.

Pokud jde o první řádek ve výše uvedeném příkladu, jde pouze o specifikaci toho, co by se mělo vrátit mému klientovi vždy, když null dojde k hodnotě. Ve výchozím nastavení vrátí SQLcl a SQL*Plus prázdné místo vždy, když null dochází v důsledku SQL SELECT prohlášení.

Můžete však použít SET NULL určit jiný řetězec, který má být vrácen. Zde jsem uvedl, že řetězec null by měl být vrácen.

'nlsparam' Argument

Volitelný 'nlsparam' argument určuje jazyk, ve kterém jsou poskytovány názvy měsíců a dnů a zkratky. Má následující podobu:

'NLS_DATE_LANGUAGE = language'

Příklad

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;

Výsledek:

25-AUG-30 06.10.35.123456789 PM +02:00

Upozorňujeme, že výsledek se stále vrací podle NLS_TIMESTAMP_TZ_FORMAT aktuální relace parametr. Jde jen o to, že vstup byl v jiném jazyce.

Zde je to, co se stane, když změním agosto do August při použití stejného 'nlsparam' hodnota:

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;

Výsledek:

Error report -
ORA-01843: not a valid month

Stalo se to, protože jsem neuvedl datum v jazyce určeném parametrem 'nlsparam' argument (španělsky).

Změňte jej na English řeší tento problém:

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;

Výsledek:

25-AUG-30 06.10.35.123456789 PM +02:00

Pokud to pomůže, viz Jak vrátit seznam podporovaných jazyků v Oracle.

Nulové argumenty

Předávání null výsledkem je null :

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

Výsledek:

null

Neplatný počet argumentů

Volání funkce bez předání jakýchkoli argumentů má za následek chybu:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Výsledek:

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

Zdá se však, že předání příliš mnoha argumentů nezpůsobuje žádné problémy, pokud jsou platné první tři:

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;

Výsledek:

25-AUG-30 06.10.35.123456789 PM +09:30

  1. Přidání sloupce jako cizího klíče způsobí, že sloupec ERROR odkazovaný v omezení cizího klíče neexistuje

  2. Migrace databáze MySQL z CloudSQL na AWS RDS

  3. Jak najdu duplicitní hodnoty v tabulce v Oracle?

  4. SQL Server UNION - Jaké je výchozí ORDER BY Chování