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"