V databázi Oracle je to TO_TIMESTAMP()
funkce převede svůj argument na hodnotu TIMESTAMP
datový typ.
Syntaxe
Syntaxe vypadá takto:
TO_TIMESTAMP(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 TIMESTAMP
datový typ, který je určen NLS_TIMESTAMP_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(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Výsledek:
25/AUG/30 06:10:35.123456789 PM
Formát výsledku je určen NLS_TIMESTAMP_FORMAT
vaší relace parametr. Můžeme zkontrolovat hodnotu NLS_TIMESTAMP_FORMAT
dotazem na V$NLS_PARAMETERS
zobrazit:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Výsledek:
DD/MON/RR HH12:MI:SSXFF AM
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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Výsledek:
25-AUG-30 06.10.35.123456789 PM
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_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Výsledek:
25-AUG-30 06.10.35.123456789 PM
Když to uděláte, argument musí být ve výchozím formátu TIMESTAMP
datový typ, který je určen NLS_TIMESTAMP_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_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Výsledek:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
V tomto případě jsem předal hodnotu, která používá 24hodinový čas, ale můj NLS_TIMESTAMP_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_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 při převodu argumentu na TIMESTAMP
dojde k chybě typ.
Příklad:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'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_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Výsledek:
25-AUG-30 06.10.35.123456789 PM
Upozorňujeme, že výsledek se stále vrací podle NLS_TIMESTAMP_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(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Výsledek:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
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(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Výsledek:
25-AUG-30 06.10.35.123456789 PM
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(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()
FROM DUAL;
Výsledek:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
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(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL;
Výsledek:
25-AUG-30 06.10.35.123456789 PM