FUNCTION responsável por correção de BUG 'IW'

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
gee
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Ter, 23 Out 2012 8:43 am
Geraldo Viana Jr
Oracle SQL - PL/SQL Developer
Oracle Developer Application

E ai pessoal, bom, meu problema é o seguinte:

Toda vez que alguém coloca a máscara 'IW' para saber qual o número da semana do ano e a data bate com por exemplo '30/12/2013' o resultado sai '01-2013', ou seja ERRADO! pois o correto seria '01-2014', sendo assim, ao invés de deixar a máscara dessa forma:

Selecionar tudo

SELECT To_Char(To_Date('30/12/2013'), 'IW - YYYY')
FROM dual;
Deve se deixar assim certo:

Selecionar tudo

SELECT To_Char(To_Date('30/12/2013'), 'IW - IYYY')
FROM dual;
Substituindo o primeiro 'Y' por 'I' que se resolve o BUG.

A minha duvida é a respeito de uma função que eu estava tentando criar para automatizar isso, e ela ficou dessa forma:

Selecionar tudo

CREATE OR REPLACE FUNCTION first_correct(p_dat DATE)
RETURN VARCHAR2 IS


v_dat_res  DATE;

BEGIN 
v_dat_res :=  To_Char(to_date(p_dat), 'IW - IYYY');


RETURN (v_dat_res);

END;

E quando executo por exemplo:

Selecionar tudo

SELECT first_correct('30/12/2013')
FROM dual;

Recebo este erro do Oracle:

ORA - 01843: not a valid month.

Alguém tem alguma ideia do que poderia estar errado com a função ou com a ideia?


Valeu abraço
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Seguinte.
1) Sobre o "ERRO" ou "BUG" que você se refere ao "IW-IYYY".
Quando você coloca o "I" na mascara do to_char, ela se refere ao ISO_DATE ( http://en.wikipedia.org/wiki/ISO_week_date ).
A forma correta é realmente a to_char(date,"IW-IYYY"). Pois você esta querendo a referência ISO desta data. Não adianta colocar apenas o IW para a semana, se quiser que traga o ano ISO terá que colocar o "I" na frente. Senão,com "YYYY" você trará apenas o ano informado (no seu caso 2013). Não é BUG. Cada mascara do to_char tem sua regra.

2)FUNCTION.
Quando você chama sua função com

Selecionar tudo

first_correct('30/12/2013')
.
O que você está passando, na verdade(também depende da configuração do servidor e da aplicação), não é um campo DATE (como tem na chamada da função "first_correct(p_dat DATE)") e sim um VARCHAR. Recomendo fazer um to_DATE colocando a máscara adequada:

Selecionar tudo

first_correct(To_Date('30/12/2013','dd/mm/yyyy'))
.

Além disso, dentro da função , é chamada a função "to_date(p_dat)", desnecessáriamente, pois o parâmetro já é date.

Selecionar tudo

v_dat_res :=  To_Char(to_date(p_dat), 'IW - IYYY');
Sempre quando for fazer TO_DATE, recomendo colocar a mascara adequada.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 9 visitantes