October 22, 2008

Compatibilizando

Filed under: postgresql — coutinho @ 2:41 am

Atendendo a pedidos um exemplo de uma das funções que tivemos que implementar no PostgreSQL afim de diminuir a edição das funções oracle a serem migradas. A função months_between retorna a quantidade de meses entre 2 datas:

CREATE OR REPLACE FUNCTION public.months_between(datafinal date, datainicial date)
  RETURNS integer AS
$BODY$
declare
  retorno integer;
begin
  begin
	 select extract('month' from age(datafinal, datainicial))  into retorno;
  exception
	 when others then
	 RETURN null;
  end;
  return retorno;
end;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE STRICT

Espero que sirva de alguma coisa :)

5 Comments »

  1. por gentileza coutinho, poderia fazer algum Post sobre a nova versão do Postgres Plus,procurei no Google, mas achei pouca coisa sobre ele, fico grato..valeu..

    Comment by Henrique — October 26, 2008 @ 4:37 am

  2. Posso escrever algo, mas posso adiantar alguma coisa :

    O postgres Plus é um produto proprietário da enterprisedb (www.enterprisedb.com) e é como se fosse uma distribuição personalizada do PostgreSQL, assim como fazem com as distribuições Linux.

    Nesse caso a enterprisedb junta uma série de softwares opensource como slony, pgpool, postgis e outros e geram um instalador estilo windows.

    No quesito comatibilidade traz uma enorme compatibilidade com o Oracle, contudo o Postgres Plus é para ser uma versão gratuita dentro de certas limitações (como o Oracle XE). Para usar todos os recursos em um robusto ambiente de produção é necessário pagar licença e contrato de suporte.

    Se você tem um bom domínio do PostgreSQL vale mais você tentar montar o seu PostgreSQL ++ :)

    Comment by coutinho — October 26, 2008 @ 11:39 am

  3. Eu precisava de uma função que retorna-se a quantidade de meses entre duas datas qualquer, e essa função me abriu as portas da mente. Mas no final tive que fazer esta modificação para atender as minhas necessidades.

    CREATE OR REPLACE FUNCTION months_between(datafinal date, datainicial date)
    RETURNS integer AS
    $BODY$
    declare
    retornoano integer;
    retornomeses integer;
    retorno integer;
    begin
    begin
    select extract(’year’ from age(datafinal, datainicial)) into retornoano;

    if retornoano isnull then
    retornoano := 0;
    end if;

    retornoano := retornoano * 12;

    select extract(’month’ from age(datafinal, datainicial)) into retornomeses;

    if retornomeses isnull then
    retornomeses := 0;
    end if;

    retorno := retornoano + retornomeses;
    exception
    when others then
    RETURN null;
    end;
    return retorno;
    end;
    $BODY$
    LANGUAGE ‘plpgsql’ IMMUTABLE STRICT

    Comment by Carlos Martins Espinoza — October 28, 2008 @ 1:31 pm

  4. Cara, mais uma vez parabéns, seu blog tá 10 em conteúdo !
    Deixa eu fazer uma pergunta, essa função dá certo quando as datas estão em anos diferentes ?
    Acho que o select teria que ficar algo +- assim:
    select (date_part(’year’, age(’2008-02-01′, ‘2007-01-01′)) * 12)
    + date_part(’month’, age(’2008-02-01′, ‘2007-01-01′)) ;

    Comment by Hamilton R. Amorim — June 23, 2009 @ 6:43 pm

  5. Opa, deu certinho, retorna a quantidade de meses entre o periodo que for informado no parâmetro, e nos usamos ela até hoje, teve que ser escrita de forma procedural para que os demais membros da equipe sem muita experiência em linguagem SQL pudesse entender….

    Comment by Carlos Martins Espinoza — February 21, 2010 @ 10:42 pm

RSS feed for comments on this post. TrackBack URI

Leave a comment