In Oracle Database, de TO_TIMESTAMP()
functie converteert zijn argument naar een waarde van TIMESTAMP
gegevenstype.
Syntaxis
De syntaxis gaat als volgt:
TO_TIMESTAMP(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Het char
argument kan elke expressie zijn die resulteert in een tekenreeks van CHAR
, VARCHAR2
, NCHAR
, of NVARCHAR2
gegevenstype.
De optionele fmt
specificeert het formaat van char
. Als u fmt
weglaat , dan char
moet de standaardnotatie hebben van de TIMESTAMP
gegevenstype, dat wordt bepaald door de NLS_TIMESTAMP_FORMAT
initialisatieparameter (zie Het datumformaat van uw Oracle-sessie controleren).
De optionele 'nlsparam'
argument specificeert de taal waarin maand- en dagnamen en afkortingen worden gegeven. Het heeft de volgende vorm:
'NLS_DATE_LANGUAGE = language'
Voorbeeld
Hier is een eenvoudig voorbeeld om te demonstreren:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Resultaat:
25/AUG/30 06:10:35.123456789 PM
Het formaat van het resultaat wordt bepaald door de NLS_TIMESTAMP_FORMAT
. van uw sessie parameter. We kunnen de waarde van de NLS_TIMESTAMP_FORMAT
. controleren parameter door de V$NLS_PARAMETERS
. op te vragen bekijken:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Resultaat:
DD/MON/RR HH12:MI:SSXFF AM
De standaardwaarde van de NLS_TIMESTAMP_FORMAT
parameter is afgeleid van de NLS_TERRITORY
parameter. In mijn geval de NLS_TERRITORY
parameter is AUSTRALIA
.
Dit gebeurt er als ik de NLS_TERRITORY
wijzig parameter naar een ander gebied en roep dan TO_TIMESTAMP()
. aan nogmaals:
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;
Resultaat:
25-AUG-30 06.10.35.123456789 PM
Deze keer wordt het resultaat in een ander formaat geretourneerd.
U kunt ook de waarde van de NLS_TIMESTAMP_FORMAT
. wijzigen parameter direct. Hierdoor wordt die parameter gewijzigd zonder andere parameters te beïnvloeden. Zie Het datumformaat wijzigen in uw Oracle-sessie voor meer informatie en voorbeelden.
Standaardformaat
In dit voorbeeld laat ik de fmt
. weg argument:
SELECT
TO_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Resultaat:
25-AUG-30 06.10.35.123456789 PM
Wanneer u dit doet, moet het argument de standaardindeling hebben van de TIMESTAMP
gegevenstype, dat wordt bepaald door de NLS_TIMESTAMP_FORMAT
initialisatieparameter.
Hier is een voorbeeld van wat er gebeurt als we een waarde doorgeven die niet aan dit formaat voldoet:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Resultaat:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
In dit geval heb ik een waarde doorgegeven die 24 uur gebruikt, maar mijn NLS_TIMESTAMP_FORMAT
parameter specificeert een 12-uursklok met de AM/PM-aanduiding.
Om dit op te lossen, moet ik ofwel mijn invoer wijzigen, of de waarde van de NLS_TIMESTAMP_FORMAT
wijzigen parameter.
Geef een standaardwaarde op bij conversiefout
U hebt ook de mogelijkheid om een waarde op te geven die moet worden geretourneerd in het geval dat er een fout optreedt tijdens het converteren van het argument naar een TIMESTAMP
typ.
Voorbeeld:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Resultaat:
null
In dit geval heb ik gespecificeerd dat null
moet worden geretourneerd wanneer er een conversiefout is.
Standaard retourneren SQLcl en SQL*Plus een spatie wanneer null
treedt op als resultaat van een SQL SELECT
uitspraak.
U kunt echter SET NULL
. gebruiken om een andere tekenreeks op te geven die moet worden geretourneerd. Hier heb ik gespecificeerd dat de string null
moet worden geretourneerd.
De 'nlsparam'
Argument
De optionele 'nlsparam'
argument specificeert de taal waarin maand- en dagnamen en afkortingen worden gegeven. Het heeft de volgende vorm:
'NLS_DATE_LANGUAGE = language'
Voorbeeld
SELECT
TO_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultaat:
25-AUG-30 06.10.35.123456789 PM
Merk op dat het resultaat nog steeds wordt geretourneerd volgens de NLS_TIMESTAMP_FORMAT
van de huidige sessie parameter. Het is alleen dat de invoer was in een andere taal.
Dit gebeurt er als ik agosto
verander tot August
terwijl je dezelfde 'nlsparam'
. gebruikt waarde:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultaat:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
Dit gebeurde omdat ik de datum niet heb opgegeven in de taal gespecificeerd door de 'nlsparam'
argument (Spaans).
Verander het in English
lost dit probleem op:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultaat:
25-AUG-30 06.10.35.123456789 PM
Zie Hoe u een lijst met ondersteunde talen in Oracle kunt retourneren als dit helpt.
Nullargumenten
Doorgeven van null
resulteert in null
:
SET NULL 'null';
SELECT
TO_TIMESTAMP(null)
FROM DUAL;
Resultaat:
null
Ongeldig aantal argumenten
Het aanroepen van de functie zonder het doorgeven van argumenten resulteert in een fout:
SELECT TO_TIMESTAMP()
FROM DUAL;
Resultaat:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
Te veel argumenten doorgeven lijkt echter geen problemen te veroorzaken, zolang de eerste drie geldig zijn:
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;
Resultaat:
25-AUG-30 06.10.35.123456789 PM