No banco de dados Oracle, o
TO_DATE()
função converte seu argumento para um valor de DATE
tipo de dados. Sintaxe
A sintaxe fica assim:
TO_DATE(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 de data padrão. O formato de data padrão é determinado pelo NLS_DATE_FORMAT
parâmetro de inicialização, que é definido implicitamente pelo NLS_TERRITORY
parâmetro, mas também pode ser definido explicitamente (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_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Resultado:
25/AUG/30
O formato do resultado é determinado pelo
NLS_DATE_FORMAT
da sua sessão parâmetro. Podemos verificar o valor do NLS_DATE_FORMAT
parâmetro consultando o V$NLS_PARAMETERS
visualizar:SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Resultado:
DD/MON/RR
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_DATE(
'25-Aug-2030',
'DD-Mon-RRRR'
)
FROM DUAL;
Resultado:
25-AUG-30
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_DATE(
'25-AUG-30'
)
FROM DUAL;
Resultado:
25-AUG-30
Ao fazer isso, o argumento deve estar no formato padrão do
DATE
tipo de dados, que é determinado pelo NLS_DATE_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_DATE(
'2030-08-25'
)
FROM DUAL;
Resultado:
Error report - ORA-01861: literal does not match format string
Para corrigir isso, eu precisaria alterar minha entrada ou alterar o valor do
NLS_DATE_FORMAT
parâmetro. Geralmente não é uma boa prática omitir o modelo de formato. Em outras palavras, é uma boa prática sempre fornecer um modelo de formato ao usar esta função. Aqui está uma lista completa de elementos de formato de data e hora que podem ser usados ao construir um modelo de formato.
Forneça um valor padrão no erro de conversão
Você também tem a opção de fornecer um valor a ser retornado caso haja um erro ao converter o argumento em um
DATE
tipo. Exemplo:
SET NULL 'null';
SELECT
TO_DATE(
'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_DATE(
'25-agosto-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Resultado:
25-AUG-30
Observe que o resultado ainda é retornado de acordo com o
NLS_DATE_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_DATE(
'25-August-2030',
'DD-Month-RRRR',
'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_DATE(
'25-August-2030',
'DD-Month-RRRR',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Resultado:
25-AUG-30
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_DATE(null)
FROM DUAL;
Resultado:
null
Contagem de argumentos inválida
Chamar a função sem passar nenhum argumento resulta em um erro:
SELECT TO_DATE()
FROM DUAL;
Resultado:
SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
E passar muitos argumentos também resulta em um erro:
SELECT
TO_DATE(
'25-Aug-2030',
'DD-Mon-RRRR',
'NLS_DATE_LANGUAGE = English',
'Gosh',
'Dang'
)
FROM DUAL;
Resultado:
SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function"