No Oracle Database, o
TO_TIMESTAMP_TZ()
função converte seu argumento para um valor de TIMESTAMP WITH TIME ZONE
tipo de dados. Sintaxe
A sintaxe fica assim:
TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
O
char
argumento pode ser qualquer expressão que resulte em uma cadeia de caracteres de CHAR
, VARCHAR2
, NCHAR
, ou NVARCHAR2
tipo de dados. O opcional
fmt
argumento especifica o formato de char
. Se você omitir fmt
, então char
deve estar no formato padrão do TIMESTAMP WITH TIME ZONE
tipo de dados, que é determinado pelo NLS_TIMESTAMP_TZ_FORMAT
parâmetro de inicialização (consulte Como verificar o formato de data da sua sessão Oracle). O opcional
'nlsparam'
O argumento especifica o idioma no qual os nomes e abreviações de mês e dia são fornecidos. Ele assume a seguinte forma:'NLS_DATE_LANGUAGE = language'
Exemplo
Aqui está um exemplo básico para demonstrar:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
Resultado:
25/AUG/30 06:10:35.123456789 PM +09:30
O formato do resultado é determinado pelo
NLS_TIMESTAMP_TZ_FORMAT
da sua sessão parâmetro. Podemos verificar o valor do NLS_TIMESTAMP_TZ_FORMAT
parâmetro consultando o V$NLS_PARAMETERS
visualizar:SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';
Resultado:
DD/MON/RR HH12:MI:SSXFF AM TZR
O valor padrão do
NLS_TIMESTAMP_TZ_FORMAT
parâmetro é derivado do NLS_TERRITORY
parâmetro. No meu caso, o NLS_TERRITORY
parâmetro é AUSTRALIA
. Veja o que acontece quando eu mudo o
NLS_TERRITORY
parâmetro para outro território e chame TO_TIMESTAMP_TZ()
novamente: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;
Resultado:
25-AUG-30 06.10.35.123456789 PM +09:30
Desta vez, o resultado é retornado em um formato diferente.
Você também pode alterar o valor do
NLS_TIMESTAMP_TZ_FORMAT
parâmetro diretamente. Isso mudará esse parâmetro sem afetar outros parâmetros. Consulte Como alterar o formato de data em sua sessão Oracle para obter mais informações e exemplos. Formato padrão
Neste exemplo eu omito o
fmt
argumento:SELECT
TO_TIMESTAMP_TZ(
'25-AUG-30 06.10.35.123456789 PM +09:30'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM +09:30
Ao fazer isso, o argumento deve estar no formato padrão do
TIMESTAMP WITH TIME ZONE
tipo de dados, que é determinado pelo NLS_TIMESTAMP_TZ_FORMAT
parâmetro. Aqui está um exemplo do que acontece quando passamos um valor que não está em conformidade com este formato:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30'
)
FROM DUAL;
Resultado:
Error report - ORA-01849: hour must be between 1 and 12
Nesse caso, passei um valor que usa 24 horas, mas meu
NLS_TIMESTAMP_TZ_FORMAT
O parâmetro especifica um relógio de 12 horas com o designador AM/PM. Para corrigir isso, eu precisaria alterar minha entrada ou alterar o valor do
NLS_TIMESTAMP_TZ_FORMAT
parâmetro. Forneça um valor padrão no erro de conversão
Você também tem a opção de fornecer um valor para retornar caso haja um erro ao converter o argumento em um
TIMESTAMP WITH TIME ZONE
tipo. Exemplo:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Resultado:
null
Neste caso eu especifiquei que
null
deve ser retornado sempre que houver um erro de conversão. O valor de retorno pode ser uma expressão ou uma variável de ligação e deve ser avaliada como uma cadeia de caracteres de CHAR
, VARCHAR2
, NCHAR
, ou NVARCHAR2
tipo de dados ou null
. A função então converte para TIMESTAMP WITH TIME ZONE
. Se ocorrer um erro durante essa conversão, um erro será retornado. Em relação à primeira linha no exemplo acima, isso é simplesmente para especificar o que deve ser retornado ao meu cliente sempre que um
null
valor ocorre. Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que null
ocorre como resultado de um SQL SELECT
demonstração. No entanto, você pode usar
SET NULL
para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null
deve ser devolvido. O 'nlsparam'
Argumento
O opcional
'nlsparam'
O argumento especifica o idioma no qual os nomes e abreviações de mês e dia são fornecidos. Ele assume a seguinte forma:'NLS_DATE_LANGUAGE = language'
Exemplo
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;
Resultado:
25-AUG-30 06.10.35.123456789 PM +02:00
Observe que o resultado ainda é retornado de acordo com o
NLS_TIMESTAMP_TZ_FORMAT
da sessão atual parâmetro. É só que a entrada estava em outro idioma. Veja o que acontece quando eu mudo
August
para August
enquanto usa o mesmo 'nlsparam'
valor: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;
Resultado:
Error report - ORA-01843: not a valid month
Isso aconteceu porque não forneci a data no idioma especificado pelo
'nlsparam'
argumento (espanhol). Alterando para
English
resolve este 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;
Resultado:
25-AUG-30 06.10.35.123456789 PM +02:00
Consulte Como retornar uma lista de idiomas suportados no Oracle se isso ajudar.
Argumentos nulos
Passando
null
resulta em null
:SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(null)
FROM DUAL;
Resultado:
null
Contagem de argumentos inválida
Chamar a função sem passar nenhum argumento resulta em um erro:
SELECT TO_TIMESTAMP_TZ()
FROM DUAL;
Resultado:
Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
No entanto, passar muitos argumentos não parece causar problemas, desde que os três primeiros sejam válidos:
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;
Resultado:
25-AUG-30 06.10.35.123456789 PM +09:30