No Oracle Database, o
TO_TIMESTAMP()
função converte seu argumento para um valor de TIMESTAMP
tipo de dados. Sintaxe
A sintaxe fica assim:
TO_TIMESTAMP(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
especifica o formato de char
. Se você omitir fmt
, então char
deve estar no formato padrão do TIMESTAMP
tipo de dados, que é determinado pelo NLS_TIMESTAMP_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(
'25-Aug-2030 18:10:35.123456789',
'DD-Mon-RRRR HH24:MI:SS.FF'
)
FROM DUAL;
Resultado:
25/AUG/30 06:10:35.123456789 PM
O formato do resultado é determinado pelo
NLS_TIMESTAMP_FORMAT
da sua sessão parâmetro. Podemos verificar o valor do NLS_TIMESTAMP_FORMAT
parâmetro consultando o V$NLS_PARAMETERS
visualizar:SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT';
Resultado:
DD/MON/RR HH12:MI:SSXFF AM
O valor padrão do
NLS_TIMESTAMP_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()
novamente: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;
Resultado:
25-AUG-30 06.10.35.123456789 PM
Desta vez, o resultado é retornado em um formato diferente.
Você também pode alterar o valor do
NLS_TIMESTAMP_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(
'25-AUG-30 06.10.35.123456789 PM'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
Ao fazer isso, o argumento deve estar no formato padrão do
TIMESTAMP
tipo de dados, que é determinado pelo NLS_TIMESTAMP_FORMAT
parâmetro de inicialização. Aqui está um exemplo do que acontece quando passamos um valor que não está em conformidade com este formato:
SELECT
TO_TIMESTAMP(
'25-Aug-2030 18:10:35.123456789'
)
FROM DUAL;
Resultado:
ORA-01849: hour must be between 1 and 12 01849. 00000 - "hour must be between 1 and 12" *Cause: *Action:
Nesse caso, passei um valor que usa 24 horas, mas meu
NLS_TIMESTAMP_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_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
tipo. Exemplo:
SET NULL 'null';
SELECT
TO_TIMESTAMP(
'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. 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(
'25-agosto-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
Observe que o resultado ainda é retornado de acordo com o
NLS_TIMESTAMP_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(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
ORA-01843: not a valid month 01843. 00000 - "not a valid month" *Cause: *Action:
Isso aconteceu porque não forneci a data no idioma especificado pelo
'nlsparam'
argumento (espanhol). Alterando para
English
resolve este problema:SELECT
TO_TIMESTAMP(
'25-August-2030 18:10:35.123456789',
'DD-Month-RRRR HH24:MI:SS.FF',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultado:
25-AUG-30 06.10.35.123456789 PM
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(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()
FROM DUAL;
Resultado:
ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action: Error at Line: 8 Column: 8
No entanto, passar muitos argumentos não parece causar problemas, desde que os três primeiros sejam válidos:
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;
Resultado:
25-AUG-30 06.10.35.123456789 PM