Compatibilizando
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 ![]()

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
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
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
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
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