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

Funkce TO_DATE() v Oracle

V databázi Oracle je TO_DATE() funkce převede svůj argument na hodnotu DATE datový typ.

Syntaxe

Syntaxe vypadá takto:

TO_DATE(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 určuje formát char . Pokud vynecháte fmt a poté char musí být ve výchozím formátu data. Výchozí formát data je určen NLS_DATE_FORMAT inicializační parametr, který je sám o sobě implicitně nastaven pomocí NLS_TERRITORY parametr, ale lze jej také nastavit explicitně (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_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR'
    )
FROM DUAL;

Výsledek:

25/AUG/30

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

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

Výsledek:

DD/MON/RR

Výchozí hodnota NLS_TIMESTAMP_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() znovu:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR'
    )
FROM DUAL;

Výsledek:

25-AUG-30

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

Alternativně můžete změnit hodnotu NLS_TIMESTAMP_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_DATE(
        '25-AUG-30'
    )
FROM DUAL;

Výsledek:

25-AUG-30

Když to uděláte, argument musí být ve výchozím formátu DATE datový typ, který je určen NLS_DATE_FORMAT inicializační parametr.

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

SELECT 
    TO_DATE(
        '2030-08-25'
    )
FROM DUAL;

Výsledek:

Error report -
ORA-01861: literal does not match format string

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

Obecně není dobrým zvykem vynechávat model formátu. Jinými slovy, při použití této funkce je dobrým zvykem vždy poskytnout model formátu. Zde je úplný seznam prvků formátu datetime, které lze použít při vytváření modelu formátu.

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

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

Příklad:

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

Výsledek:

null

V tomto případě jsem uvedl, že null by měla být vrácena vždy, když dojde k chybě převodu.

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_DATE(
        '25-agosto-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Výsledek:

25-AUG-30

Všimněte si, že výsledek se stále vrací podle NLS_DATE_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_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        '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_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Výsledek:

25-AUG-30

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_DATE(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_DATE()
FROM DUAL;

Výsledek:

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

A předání příliš mnoha argumentů také vede k chybě:

SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR',
        'NLS_DATE_LANGUAGE = English',
        'Gosh',
        'Dang'
    )
FROM DUAL;

Výsledek:

SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"

  1. Postgres NENÍ v poli

  2. Rozměry dimenzí:Podívejte se na nejběžnější typy dimenzionálních tabulek v Data Warehousing

  3. Zkontrolujte, zda jsou dva výběry ekvivalentní

  4. Jak povolit pomalé dotazy Přihlášení do PostgreSQL