cursor para corrigir datas com mês dias e ano invertido

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
nor.dbajunior
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 02 Dez 2010 10:32 pm
Localização: cuiaba

Pessoal temos uma amostra de dados de um sistemas (ADABAS)da década de 1970 e como este banco é hierárquico e não havia critica, foi trabalhando ate os dias de hoje, por exemplo ao fazer um cadastro temos registros com datas e mês e ano invertidos.
exemplo MM/DD/YYYY
YYYY/MM/DD
MM/DD/YYYY
DD/YYYY/MM
Lembrando que estes dados foram exportados para textos separado por ; e foram importados para um banco de dados oracle com tipos de dados todos varchar, inclusive estes campo com datas. Como poderei fazer um cursor que ajusta estes campos e inseri em outra tabela já normalizada?.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá,

Teoricamente não precisa de cursor. Se seus dados estiverem sempre com um padrão , um mero update pode resolver seu problema.
O problema , segundo relatado , é que tens 3 padrões diferentes(pegando a data de hoje como exemplo):
YYYY/MM/DD (2014/03/06)
MM/DD/YYYY (03/06/2014)
DD/YYYY/MM (06/2014/03)

Se forem apenas esses os padrões de data fica razoável realizar o update.
Você pode diferenciar cada padrão pelas posições do "/", em cada padrão desse o ANO fica ou no inicio ou no fim ou no meio.
Agora é importante identificar corretamente cada padrão antes de realizar o ajuste.
Se tiver 2 padrões como:
DD/MM/YYYY
MM/DD/YYYY

Aí tem-se um problema, pois não dá para dizer se certa data é mês/dia ou dia/mês.

Após identificado tudo basta um update

Selecionar tudo

set campo_data = to_date(data_texto,'DD/YYYY/MM')
Pode Identificar os padrões com INSTR ou SUBSTR (exemplo do "DD/YYYY/MM"):
INSTR

Selecionar tudo

INSTR('01/1230/12','/',1) = 3
AND INSTR('01/1230/12','/',4) = 8 
SUBSTR

Selecionar tudo

SUBSTR('01/1230/12',3,1) = '/'
AND SUBSTR('01/1230/12',8,1) = '/'
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Lembrando ainda que podes realizar a identificação de padrão com expressões regulares:

Selecionar tudo

REGEXP_LIKE ('01/1230/12', '^\d{2}/\d{4}/\d{2}$')
Ou seja, caso tenha o padrão '99/9999/99', onde 9 representa decimal.
nor.dbajunior
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 02 Dez 2010 10:32 pm
Localização: cuiaba

Opa, valeu obrigado, vou testar e assim que puder eu retorno.
Responder
  • Informação