Oracle
 sql >> Database >  >> RDS >> Oracle

TO_TIMESTAMP_TZ() Funzione in Oracle

In Oracle Database, il TO_TIMESTAMP_TZ() la funzione converte il suo argomento in un valore di TIMESTAMP WITH TIME ZONE tipo di dati.

Sintassi

La sintassi è questa:

TO_TIMESTAMP_TZ(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 argomento specifica il formato di char . Se ometti fmt , quindi char deve essere nel formato predefinito del TIMESTAMP WITH TIME ZONE tipo di dati, determinato da NLS_TIMESTAMP_TZ_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_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Risultato:

25/AUG/30 06:10:35.123456789 PM +09:30

Il formato del risultato è determinato dal NLS_TIMESTAMP_TZ_FORMAT della tua sessione parametro. Possiamo controllare il valore di NLS_TIMESTAMP_TZ_FORMAT parametro interrogando il V$NLS_PARAMETERS visualizza:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';

Risultato:

DD/MON/RR HH12:MI:SSXFF AM TZR

Il valore predefinito di NLS_TIMESTAMP_TZ_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_TZ() ancora:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Risultato:

25-AUG-30 06.10.35.123456789 PM +09:30

Questa volta il risultato viene restituito in un formato diverso.

In alternativa puoi modificare il valore di NLS_TIMESTAMP_TZ_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_TZ(
        '25-AUG-30 06.10.35.123456789 PM +09:30'
    )
FROM DUAL;

Risultato:

25-AUG-30 06.10.35.123456789 PM +09:30

Quando si esegue questa operazione, l'argomento deve essere nel formato predefinito di TIMESTAMP WITH TIME ZONE tipo di dati, determinato da NLS_TIMESTAMP_TZ_FORMAT parametro.

Ecco un esempio di cosa succede quando passiamo un valore che non è conforme a questo formato:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30'
    )
FROM DUAL;

Risultato:

Error report -
ORA-01849: hour must be between 1 and 12

In questo caso, ho passato un valore che utilizza 24 ore, ma il mio NLS_TIMESTAMP_TZ_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_TZ_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 WITH TIME ZONE digitare.

Esempio:

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(
    'Oops!'
    DEFAULT null ON CONVERSION ERROR
    )
FROM DUAL;

Risultato:

null

In questo caso ho specificato che null dovrebbe essere restituito ogni volta che si verifica un errore di conversione. Il valore restituito può essere un'espressione o una variabile di collegamento e deve restituire una stringa di caratteri di CHAR , VARCHAR2 , NCHAR o NVARCHAR2 tipo di dati o null . La funzione lo converte quindi in TIMESTAMP WITH TIME ZONE . Se si verifica un errore durante questa conversione, viene restituito un errore.

Per quanto riguarda la prima riga nell'esempio sopra, questo è semplicemente per specificare cosa dovrebbe essere restituito al mio cliente ogni volta che un null si verifica il valore. 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' 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

SELECT 
    TO_TIMESTAMP_TZ(
        '25-agosto-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Risultato:

25-AUG-30 06.10.35.123456789 PM +02:00

Nota che il risultato viene comunque restituito in base al NLS_TIMESTAMP_TZ_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_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Risultato:

Error report -
ORA-01843: not a valid month

Ciò è accaduto perché non ho fornito la data nella lingua specificata da 'nlsparam' argomento (spagnolo).

Cambiandolo in English risolve questo problema:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Risultato:

25-AUG-30 06.10.35.123456789 PM +02:00

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_TZ(null)
FROM DUAL;

Risultato:

null

Conteggio argomenti non valido

La chiamata della funzione senza passare alcun argomento genera un errore:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Risultato:

Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Tuttavia, passare troppi argomenti non sembra causare alcun problema, purché i primi tre siano validi:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English',
        'Oops!',
        'Dang!',
        'Homer',
        'Symptom'
    )
FROM DUAL;

Risultato:

25-AUG-30 06.10.35.123456789 PM +09:30