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
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a