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.
>
> --
> Matheus de Oliveira
>
> _______________________________________________
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
 "mais performática"? Eu apostaria  ORDER BY a.dt_mov, por não executar
funções de conversão

-- 
Anselmo M. Silva
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a