Em 30 de agosto de 2012 12:14, Matheus de Oliveira < matioli.math...@gmail.com> escreveu:
> > 2012/8/30 Anselmo Silva <anselmo....@gmail.com> > >> >> >> Em 30 de agosto de 2012 08:25, Matheus de Oliveira < >> matioli.math...@gmail.com> escreveu: >> >>> >>> >>> >>> 2012/8/29 Osvaldo Kussama <osvaldo.kuss...@gmail.com> >>> >>>> Em 29/08/12, Matheus de Oliveira<matioli.math...@gmail.com> escreveu: >>>> > 2012/8/29 Osvaldo Kussama <osvaldo.kuss...@gmail.com> >>>> > >>>> >> Em 29/08/12, Edson Lidorio<edson...@gmail.com> 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. >>> >> "mais performática"? Eu apostaria ORDER BY a.dt_mov, por não executar >> funções de conversão >> >> > Não tenho certeza, pois tem a contrapartida de que o PostgreSQL tem que > gerenciar muito mais chaves únicas na ordenação, o que poderia causar uso > de arquivos temporários (principalmente se houver muitos registros). > > Mas de qualquer forma acho que a diferença dessas opções seriam poucas. > > -- > Matheus de Oliveira > > _______________________________________________ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > Concordo -- Anselmo M. Silva
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral