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

Função TO_TIMESTAMP() no Oracle


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