I Oracle Database er TO_DATE()
funktion konverterer sit argument til en værdi på DATE
datatype.
Syntaks
Syntaksen ser sådan ud:
TO_DATE(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
char
argument kan være ethvert udtryk, der evalueres til en tegnstreng af CHAR
, VARCHAR2
, NCHAR
eller NVARCHAR2
datatype.
Den valgfri fmt
angiver formatet for char
. Hvis du udelader fmt
, derefter char
skal være i standarddatoformatet. Standarddatoformatet bestemmes af NLS_DATE_FORMAT
initialiseringsparameter, som i sig selv er implicit sat af NLS_TERRITORY
parameter, men kan også indstilles eksplicit (se Sådan kontrollerer du datoformatet for din Oracle-session).
Den valgfrie 'nlsparam'
argument angiver det sprog, som måneds- og dagnavne og forkortelser angives på. Det har følgende form:
'NLS_DATE_LANGUAGE = language'
Eksempel
Her er et grundlæggende eksempel for at demonstrere:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Resultat:
25/AUG/30
Formatet på resultatet bestemmes af din sessions NLS_DATE_FORMAT
parameter. Vi kan kontrollere værdien af NLS_DATE_FORMAT
parameter ved at forespørge på V$NLS_PARAMETERS
se:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Resultat:
DD/MON/RR
Standardværdien for NLS_TIMESTAMP_FORMAT
parameteren er afledt af NLS_TERRITORY
parameter. I mit tilfælde NLS_TERRITORY
parameteren er AUSTRALIA
.
Her er, hvad der sker, når jeg ændrer NLS_TERRITORY
parameter til et andet område, og kald derefter TO_TIMESTAMP()
igen:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Resultat:
25-AUG-30
Denne gang returneres resultatet i et andet format.
Du kan alternativt ændre værdien af NLS_TIMESTAMP_FORMAT
parameter direkte. Dette vil ændre denne parameter uden at påvirke andre parametre. Se Sådan ændres datoformatet i din Oracle-session for flere oplysninger og eksempler.
Standardformat
I dette eksempel udelader jeg fmt
argument:
SELECT
TO_DATE(
'25-AUG-30'
)
FROM DUAL;
Resultat:
25-AUG-30
Når du gør dette, skal argumentet være i standardformatet DATE
datatype, som bestemmes af NLS_DATE_FORMAT
initialiseringsparameter.
Her er et eksempel på, hvad der sker, når vi sender en værdi, der ikke er i overensstemmelse med dette format:
SELECT
TO_DATE(
'2030-08-25'
)
FROM DUAL;
Resultat:
Error report - ORA-01861: literal does not match format string
For at rette op på dette skal jeg enten ændre mit input eller ændre værdien af NLS_DATE_FORMAT
parameter.
Det er generelt ikke god praksis at udelade formatmodellen. Det er med andre ord god praksis altid at angive en formatmodel, når du bruger denne funktion. Her er en komplet liste over datetime-formatelementer, der kan bruges, når du konstruerer en formatmodel.
Angiv en standardværdi ved konverteringsfejl
Du har også mulighed for at angive en værdi, der skal returneres i tilfælde af, at der er en fejl under konvertering af argumentet til en DATE
type.
Eksempel:
SET NULL 'null';
SELECT
TO_DATE(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Resultat:
null
I dette tilfælde specificerede jeg at null
skal returneres, når der er en konverteringsfejl.
Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når null
opstår som et resultat af en SQL SELECT
udmelding.
Du kan dog bruge SET NULL
for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null
skal returneres.
'nlsparam'
Argument
Den valgfrie 'nlsparam'
argument angiver det sprog, som måneds- og dagnavne og forkortelser angives på. Det har følgende form:
'NLS_DATE_LANGUAGE = language'
Eksempel
SELECT
TO_DATE(
'25-agosto-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultat:
25-AUG-30
Bemærk, at resultatet stadig returneres i henhold til den aktuelle sessions NLS_DATE_FORMAT
parameter. Det er bare, at input var på et andet sprog.
Her er, hvad der sker, når jeg ændrer agosto
til August
mens du bruger den samme 'nlsparam'
værdi:
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultat:
Error report - ORA-01843: not a valid month
Dette skete, fordi jeg ikke angav datoen på det sprog, der er angivet af 'nlsparam'
argument (spansk).
Ændrer det til English
løser dette problem:
SELECT
TO_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultat:
25-AUG-30
Se, hvordan du returnerer en liste over understøttede sprog i Oracle, hvis det hjælper.
Nul-argumenter
Sender null
resulterer i null
:
SET NULL 'null';
SELECT
TO_DATE(null)
FROM DUAL;
Resultat:
null
Ugyldigt antal argumenter
Kaldning af funktionen uden at sende nogen argumenter resulterer i en fejl:
SELECT TO_DATE()
FROM DUAL;
Resultat:
SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
Og at sende for mange argumenter resulterer også i en fejl:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR',
'NLS_DATE_LANGUAGE = English',
'Gosh',
'Dang'
)
FROM DUAL;
Resultat:
SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function"