Índice:


       

Introdução


Na versão 11.80, o provedor de dados é o Microsoft OLE DB Provider for Oracle, disponibilizado pela própria Microsoft, enquanto que na versão 12

o provedor de dados é o Devart ADO .Net Provider, disponibilizado pela empresa Devart.


Mais Informações

Para saber mais sobre:


Função TO_DATE()



Sintaxe

TO_DATE( string1 [, format_mask] [, nls_language] )


Descrição dos Parâmetros:

NomeDescriçãoObrigatoriedadeOutras Informações
1string1Cadeia de caracteres que será convertida em uma data válida.

2format_mask

Máscara que será utilizada para a correta formatação da data.

!Importante!

O formato (segundo parâmetro) sempre deve corresponder ao formato da string (primeiro parâmetro), assim o interpretador vai identificar qual formato esta entrando para poder converter a string em data.


3nls_languageLinguagem utilizada na conversão da cadeia de caracteres em uma data válida

Alguns dos formatos disponíveis (format_mask):

NomeDescrição
1YEARAno, soletrado
2YYYYAno (4 dígitos)
3YYY
YY
Y
Últimos 3, 2, ou 1 digito(s) do ano.
4IYY
IY
I
Últimos 3, 2, ou 1 digito(s) do ano (Padrão ISO).
5IYYYAno (4 dígitos baseados no padrão ISO)
6RRRRRecebe um ano (2 dígitos) e retorna um ano (4 dígitos)
Um valor entre 0-49 irá retornar um ano (20xx).
Um valor entre 50-99 irá retornar um ano (19xx).
7Q1/4 de um ano (1, 2, 3, 4; JAN-MAR = 1).
8MMMês (01-12; JAN = 01).
9MONNome abreviado do mês.
10MONTHNome do mês preenchido com espaços em branco para completar 9 caracteres.
11RMNumeral romano referente ao mês (I-XII; JAN = I).
12WWSemana do ano (1-53) onde a semana 1 começa no primeiro dia do ano e continua ao sétimo dia do ano.
13WSemana do mês (1-5) onde a semana 1 começa no primeiro dia do mês e termina ao sétimo.
14IWSemana do ano (1-52 ou 1-53) baseado no padrão ISO.
15DDia da semana (1-7).
16DAYNome do dia.
17DDDia do mês (1-31).
18DDDDia do ano (1-366).
19DYNome abreviado do dia.
20JDia juliano; O número de dias desde 1 de janeiro de 4712 A.C.
21HHHora do dia (1-12).
22HH12Hora do dia (1-12).
23HH24Hora do dia (0-23).
24MIMinutos (0-59).
25SSSegundos (0-59).
26SSSSSSegundos após a meia-noite (0-86399).
27AM, A.M., PM, ou P.M.Indicador Meridiano.
28AD ou A.DIndicador AD.
29BC ou B.C.Indicador BC.
30TZDInformações do Horário de Verão.
31TZHHora do fuso horário.
32TZMMinutos do fuso horário.
33TZRRegião do fuso horário.

A função TO_DATE() pode ser usada nas seguintes versões do Oracle/PLSQL:

Versão
1Oracle 12c
2Oracle 11g
3Oracle 10g
4Oracle 9i
5Oracle 8i

Exemplo:

Vamos observar alguns exemplos do uso da função TO_DATE():

Exemplo 1

TO_DATE('09/07/2003', 'dd/mm/yyyy') Resultado: valor de data referente à 9 de julho de 2003

Exemplo 2

TO_DATE('090703', 'DDMMYY') Resultado:valor de data referente à 9 de julho de 2003

Exemplo 3

TO_DATE('15032002', 'ddmmyyyy') Resultado:valor de data referente à 15 de março de 2002

Microsoft Provider x Devart Provider - TO_DATE()


Existem diversas diferenças entre esses dois provedores de dados, mas vamos focar apenas na função TO_DATE().



Microsoft OLE DB Provider Devart ADO .Net Provider

Sim/NãoDescriçãoSim/NãoDescrição
Conversões Internas
O padrão da função TO_DATE() é receber um campo do tipo string comoparâmetro, porém com as conversões internas do provedor, mesmo passando um campo do tipo datetime comoparâmetro, a função será executada sem levantar exceções.
Funciona conforme o driver nativo do oracle, ou seja, suporta apenas um campo do tipo string como parâmetro, qualquer outro tipo, uma exceção é levantada.
Formatações Internas
O padrão da função TO_DATE() é receber uma máscara de formato idêntica ao valor passado como parâmetro, porém com as formatações internas, mesmo passando uma máscara diferente do valor passado como parâmetro, a função será executada sem levantar exceções.
Funciona conforme o driver nativo do oracle, ou seja, a máscara do formato têm que ser idêntica ao valor passado como parâmetro.

Exceções Mais Comuns



Código ExceçãoDescriçãoSolução
1ORA-01830

 A imagem do formato da data termina antes de converter a string de entrada inteira.

  • Formato utilizado (2 parâmetro) não se encaixa de forma precisa ao valor passado no primeiro parâmetro da função.
    Ex: TO_DATE('02022000', 'dd/mm/yyyy') 

Informar uma máscara de data que condiz com o valor passado como parâmetro.

  • Ex: TO_DATE('02022000', 'ddmmyyyy') 
2ORA-01843

Valor do mês inválido.

  • Valores negativos (x < 0);
  • 0 (x = 0);
  • Maiores que os valores já convencionados para mês (x > 12)

Informar um mês válido.

  • Valores positivos maiores que 0 e menores ou iguais a 12 (x > 0 e x <= 12)
3ORA-01847

Valor do dia inválido.

  • Valores negativos (x < 0);
  • 0 (x = 0);
  • Maiores que os valores já convencionados para dia:
    Jan, Mar, Mai, Jul, Ago, Out, Dez (x > 31)
    Fev (x > 28 ou X > 29 se bissexto),
    Abr, Jun, Set, Nov (x > 30)


Informar um dia válido.

  • Valores positivos maiores que 0 e menores ou iguais a:
    Jan, Mar, Mai, Jul, Ago, Out, Dez (x > 0 e x <= 31)
    Fev (x > 0 e (x <= 28 ou X <= 29 se bissexto)),
    Abr, Jun, Set, Nov (x > 0 e x <= 30)

RM, Consultas SQL, Oracle e ORA-01830


A Solução geral dada acima, para a exceção de código ORA-01830, logicamente serve também para o produto RM, porém existem algumas peculiaridades que devem ser tratadas de forma isolada.

A principal peculiaridade que trataremos aqui são os parâmetros da Consulta SQL.

Para que a exceção de código ORA-01830 não aconteça, devemos ter certeza de que os parâmetros da consulta SQL utilizados na função TO_DATE():

  • Não referenciem campos da base, parâmetros do relatório, campos do relatório, que sejam nativamente do tipo datetime.

    OBSERVACAO

    Caso referenciem, devem estar acompanhados do sufixo _S; é de extrema importância que esse sufixo esteja presente nesses parâmetros, pois como definimos um tipo prévio para o parâmetro, o processo de execução da Consulta SQL não tem que detectar o tipo, fazendo com que o retorno da consulta seja mais rápido, além disso, como o tipo do parâmetro foi definido como string (cadeia de caracteres), a exceção não deverá ocorrer, lembrando que a máscara do formato deverá ser idêntica ao valor do parâmetro.

Substituindo TO_DATE para TO_CHAR


Uma ótima alternativa é substituir o TO_DATE para TO_CHAR, quando os campos utilizados na Consulta SQL sejam nativamente datetime.

O uso do TO_CHAR é mais simples, já que não é necessário que a máscara do formato seja idêntica ao valor passado como primeiro parâmetro (teoricamente data ou number) dessa função.

Ex: TO_CHAR('2003-01-01','dd/MM/yyyy')