In Oracle Database, il TO_TIMESTAMP()
la funzione converte il suo argomento in un valore di TIMESTAMP
tipo di dati.
Sintassi
La sintassi è questa:
TO_TIMESTAMP(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Il char
argomento può essere qualsiasi espressione che restituisce una stringa di caratteri di CHAR
, VARCHAR2
, NCHAR
o NVARCHAR2
tipo di dati.
Il fmt
opzionale specifica il formato di char
. Se ometti fmt
, quindi char
deve essere nel formato predefinito del TIMESTAMP
tipo di dati, determinato da NLS_TIMESTAMP_FORMAT
parametro di inizializzazione (vedi Come controllare il formato della data della tua sessione Oracle).
Il 'nlsparam'
facoltativo argomento specifica la lingua in cui vengono forniti i nomi e le abbreviazioni di mese e giorno. Ha la forma seguente:
'NLS_DATE_LANGUAGE = language'
Esempio
Ecco un esempio di base da dimostrare:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Risultato:
25/AUG/30 06:10:35.123456789 PM
Il formato del risultato è determinato dal NLS_TIMESTAMP_FORMAT
della tua sessione parametro. Possiamo controllare il valore di NLS_TIMESTAMP_FORMAT
parametro interrogando il V$NLS_PARAMETERS
visualizza:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Risultato:
DD/MON/RR HH12:MI:SSXFF AM
Il valore predefinito di NLS_TIMESTAMP_FORMAT
il parametro è derivato da NLS_TERRITORY
parametro. Nel mio caso il NLS_TERRITORY
il parametro è AUSTRALIA
.
Ecco cosa succede quando cambio NLS_TERRITORY
parametro in un altro territorio, quindi chiama TO_TIMESTAMP()
ancora:
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;
Risultato:
25-AUG-30 06.10.35.123456789 PM
Questa volta il risultato viene restituito in un formato diverso.
In alternativa puoi modificare il valore di NLS_TIMESTAMP_FORMAT
parametro direttamente. Questo cambierà quel parametro senza influenzare altri parametri. Per ulteriori informazioni ed esempi, vedere Come modificare il formato della data nella sessione Oracle.
Formato predefinito
In questo esempio ometto fmt
argomento:
SELECT
TO_TIMESTAMP(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Risultato:
25-AUG-30 06.10.35.123456789 PM
Quando si esegue questa operazione, l'argomento deve essere nel formato predefinito del TIMESTAMP
tipo di dati, determinato da NLS_TIMESTAMP_FORMAT
parametro di inizializzazione.
Ecco un esempio di cosa succede quando passiamo un valore che non è conforme a questo formato:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Risultato:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
In questo caso, ho passato un valore che utilizza 24 ore, ma il mio NLS_TIMESTAMP_FORMAT
il parametro specifica un orologio di 12 ore con il designatore AM/PM.
Per risolvere questo problema, dovrei cambiare il mio input o cambiare il valore di NLS_TIMESTAMP_FORMAT
parametro.
Fornire un valore predefinito in caso di errore di conversione
Hai anche la possibilità di fornire un valore da restituire nel caso in cui si verifichi un errore durante la conversione dell'argomento in un TIMESTAMP
digitare.
Esempio:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Risultato:
null
In questo caso ho specificato che null
deve essere restituito ogni volta che si verifica un errore di conversione.
Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che null
si verifica come risultato di un SQL SELECT
dichiarazione.
Tuttavia, puoi utilizzare SET NULL
per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null
deve essere restituito.
Il 'nlsparam'
Argomento
Il 'nlsparam'
opzionale argomento specifica la lingua in cui vengono forniti i nomi e le abbreviazioni di mese e giorno. Ha la forma seguente:
'NLS_DATE_LANGUAGE = language'
Esempio
SELECT
TO_TIMESTAMP(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Risultato:
25-AUG-30 06.10.35.123456789 PM
Nota che il risultato viene comunque restituito in base al NLS_TIMESTAMP_FORMAT
della sessione corrente parametro. È solo che l'input era in un'altra lingua.
Ecco cosa succede quando cambio August
a August
utilizzando lo stesso 'nlsparam'
valore:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Risultato:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
Ciò è accaduto perché non ho fornito la data nella lingua specificata da 'nlsparam'
argomento (spagnolo).
Cambiandolo in English
risolve questo problema:
SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Risultato:
25-AUG-30 06.10.35.123456789 PM
Vedi Come restituire un elenco di lingue supportate in Oracle se può essere d'aiuto.
Argomenti nulli
Passaggio null
risulta null
:
SET NULL 'null';
SELECT
TO_TIMESTAMP(null)
FROM DUAL;
Risultato:
null
Conteggio argomenti non valido
La chiamata della funzione senza passare alcun argomento genera un errore:
SELECT TO_TIMESTAMP()
FROM DUAL;
Risultato:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
Tuttavia, passare troppi argomenti non sembra causare alcun problema, purché i primi tre siano validi:
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;
Risultato:
25-AUG-30 06.10.35.123456789 PM