Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função TO_DATE() no Oracle


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"