I Oracle Database, TO_TIMESTAMP()
funktion konverterar sitt argument till värdet TIMESTAMP
datatyp.
Syntax
Syntaxen ser ut så här:
TO_TIMESTAMP(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
char
argument kan vara vilket uttryck som helst som utvärderas till en teckensträng av CHAR
, VARCHAR2
, NCHAR
, eller NVARCHAR2
datatyp.
Den valfria fmt
anger formatet för char
. Om du utelämnar fmt
, sedan char
måste vara i standardformatet för TIMESTAMP
datatyp, som bestäms av NLS_TIMESTAMP_FORMAT
initialiseringsparameter (se Hur du kontrollerar datumformatet för din Oracle-session).
Den valfria 'nlsparam'
argument anger det språk som månads- och dagnamn och förkortningar tillhandahålls på. Den har följande form:
'NLS_DATE_LANGUAGE = language'
Exempel
Här är ett grundläggande exempel att visa:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Resultat:
25/AUG/30 06:10:35.123456789 PM
Formatet på resultatet bestäms av din sessions NLS_TIMESTAMP_FORMAT
parameter. Vi kan kontrollera värdet på NLS_TIMESTAMP_FORMAT
parameter genom att fråga V$NLS_PARAMETERS
visa:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Resultat:
DD/MON/RR HH12:MI:SSXFF AM
Standardvärdet för NLS_TIMESTAMP_FORMAT
parametern härleds från NLS_TERRITORY
parameter. I mitt fall NLS_TERRITORY
parametern är AUSTRALIA
.
Här är vad som händer när jag ändrar NLS_TERRITORY
parametern till ett annat territorium, anrop sedan TO_TIMESTAMP()
igen:
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;
Resultat:
25-AUG-30 06.10.35.123456789 PM
Den här gången returneras resultatet i ett annat format.
Du kan alternativt ändra värdet på NLS_TIMESTAMP_FORMAT
parameter direkt. Detta kommer att ändra den parametern utan att påverka andra parametrar. Se Hur du ändrar datumformatet i din Oracle-session för mer information och exempel.
Standardformat
I det här exemplet utelämnar jag fmt
argument:
SELECT
TO_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Resultat:
25-AUG-30 06.10.35.123456789 PM
När du gör detta måste argumentet vara i standardformatet för TIMESTAMP
datatyp, som bestäms av NLS_TIMESTAMP_FORMAT
initieringsparameter.
Här är ett exempel på vad som händer när vi skickar ett värde som inte överensstämmer med detta format:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Resultat:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
I det här fallet skickade jag ett värde som använder 24 timmars tid, men min NLS_TIMESTAMP_FORMAT
parametern anger en 12-timmars klocka med AM/PM-beteckningen.
För att fixa detta måste jag antingen ändra min inmatning eller ändra värdet på NLS_TIMESTAMP_FORMAT
parameter.
Ange ett standardvärde vid konverteringsfel
Du har också möjlighet att ange ett värde som ska returneras i händelse av att det uppstår ett fel när argumentet konverteras till en TIMESTAMP
typ.
Exempel:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Resultat:
null
I det här fallet angav jag att null
ska returneras när det finns ett konverteringsfel.
Som standard returnerar SQLcl och SQL*Plus ett tomt utrymme när null
uppstår som ett resultat av en SQL SELECT
påstående.
Du kan dock använda SET NULL
för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null
bör returneras.
'nlsparam'
Argument
Den valfria 'nlsparam'
argument anger det språk som månads- och dagnamn och förkortningar tillhandahålls på. Den har följande form:
'NLS_DATE_LANGUAGE = language'
Exempel
SELECT
TO_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultat:
25-AUG-30 06.10.35.123456789 PM
Observera att resultatet fortfarande returneras enligt den aktuella sessionens NLS_TIMESTAMP_FORMAT
parameter. Det är bara ingången var på ett annat språk.
Här är vad som händer när jag ändrar agosto
till August
samtidigt som du använder samma 'nlsparam'
värde:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultat:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
Detta hände eftersom jag inte angav datumet på språket som anges av 'nlsparam'
argument (spanska).
Ändra den till English
löser detta problem:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultat:
25-AUG-30 06.10.35.123456789 PM
Se Hur man returnerar en lista över språk som stöds i Oracle om det hjälper.
Nollargument
Skickar null
resulterar i null
:
SET NULL 'null';
SELECT
TO_TIMESTAMP(null)
FROM DUAL;
Resultat:
null
Ogiltigt antal argument
Att anropa funktionen utan att skicka några argument resulterar i ett fel:
SELECT TO_TIMESTAMP()
FROM DUAL;
Resultat:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
Att skicka för många argument verkar dock inte orsaka några problem, så länge de tre första är giltiga:
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;
Resultat:
25-AUG-30 06.10.35.123456789 PM