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
