2012/8/29 Osvaldo Kussama <[email protected]>

> Em 29/08/12, Matheus de Oliveira<[email protected]> escreveu:
> > 2012/8/29 Osvaldo Kussama <[email protected]>
> >
> >> Em 29/08/12, Edson Lidorio<[email protected]> escreveu:
> >> > Só ordena, no ano atual
> >> > veja como aparece:
> >> >
> >> > 3/2012
> >> > 4/2010
> >> > 4/2012
> >> > 5/2012
> >> > 6/2011
> >> > 6/2012
> >> > 7/2012
> >> > 8/2012
> >> >
> >>
> >>
> >> Mas você está usando ORDER BY date_trunc('month', a.dt_mov);?
> >> O comportamento acima não é o usual na ordenação de um campo date.
> >> Me parece que você está ordenando por to_char(a.dt_mov, 'MM/YYYY').
> >>
> >>
> > Osvaldo, na verdade é sim, veja que se usar `ORDER BY date_trunc('month',
> > a.dt_mov);` apenas o mês será considerado na ordenação, logo todo mês de
> > Junho (inteiro 6), por exemplo, vai ficar junto independente do ano que
> > seja (2011, 2012, etc.), porque o ano não foi considerado. Logo a
> ordenação
> > tem que considerar o mês e o ano, sendo que o ano deve vir antes (ou o
> > mesmo problema acontecerá), e temos, é claro, várias formas de fazer
> isso,
> > como:
> >
> >  * ORDER BY to_char(a.dt_mov, 'YYYYMM')
> >  * ORDER BY extract(year from a.dt_mov), extract(month from a.dt_mov) (e
> a
> > variante com date_trunc, mesma coisa)
> >
> > Ambas já apresentadas aqui, e só deve-se tomar cuidado que o que aparece
> no
> > ORDER BY tem, *obrigatóriamente*, que aparecer no GROUP BY, ou o
> PostgreSQL
> > vai apresentar um erro.
> >
> > Atenciosamente,
> > --
> > Matheus de Oliveira
> >
>
> Creio que você entendeu mal a definição da função date_truc. Para
> tirar as dúvidas sugiro que você faça alguns testes.
> Do manual:
> "The function date_trunc is conceptually similar to the trunc function
> for numbers.
> date_trunc('field', source)
> source is a value expression of type timestamp or interval. (Values of
> type date and time are cast automatically to timestamp or interval,
> respectively.) field selects to which precision to truncate the input
> value. The return value is of type timestamp or interval with all
> fields that are less significant than the selected one set to zero (or
> one, for day and month)."
>
> Aproveitando o exemplo do Juliano:
> SELECT date_trunc('month', d.d)
> FROM (VALUES ('01/03/2012'::date), ('10/04/2010'), ('21/04/2012'),
> ('09/02/2012'), ('10/04/2011')) d(d)
> ORDER BY date_trunc('month', d.d);
>        date_trunc
> ------------------------
>  2010-04-01 00:00:00-03
>  2011-04-01 00:00:00-03
>  2012-02-01 00:00:00-02
>  2012-03-01 00:00:00-03
>  2012-04-01 00:00:00-03
> (5 rows)
>
> Repare que todas as datas são truncadas para o primeiro dia o mês, ou
> seja, é como se estivesse ordenando por ano/mês.
>
>
Osvaldo, peço desculpas, fiquei até com vergonha agora. Já conhecia e sabia
o que fazia a date_trunc, inclusive já usei em projetos, mas por total
falta de atenção eu a confundi com a date_part, que faria exatamente o que
eu descrevi... Desculpe novamente.

E, de qualquer forma, talvez a date_trunc não seria boa pra ele exibir os
dados (já que quer mês e ano), ao menos que formate pela aplicação. Mas
ainda seria útil no ORDER BY e GROUP BY.

Completando e corrigindo a minha lista, do que o pessoal já disse podemos
usar:

 * ORDER BY to_char(a.dt_mov, 'YYYYMM')
 * ORDER BY extract(year from a.dt_mov), extract(month from a.dt_mov) (e a
variante com *date_part*, mesma coisa)
 * ORDER BY a.dt_mov
 * ORDER BY date_trunc(a.dt_mov)

Só não sei dizer qual seria mais performática, já que todos dão o mesmo
resultado.

--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a