Como extrair ano e mês a partir da data no PostgreSQL sem usar a função to_char ()?

104

Quero selecionar sql SELECT "year-month" from table group by "year-month" AND order by date:, onde ano-mês - formato para a data "1978-01", "1923-12". selecione to_char de couse work , mas não a ordem "certa":

to_char(timestamp_column, 'YYYY-MM')
Bdfy
fonte
1
Por que o pedido não está certo com to_char?
yairchu
1
A votação para fechar não está clara porque não está claro porque to_char () não é aceitável.
Alex R

Respostas:

67
date_part(text, timestamp)

por exemplo

date_part('month', timestamp '2001-02-16 20:38:40'),
date_part('year', timestamp '2001-02-16 20:38:40') 

http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html

MK.
fonte
5
como extrair mês e ano de uma vez? você pode mostrar um exemplo
mokNathal
3
date_part ('month', timestamp '2001-02-16 20:38:40'), date_part ('year', timestamp '2001-02-16 20:38:40')
MK.
obrigado pela resposta rápida, mas não podemos fazer isso em uma única função ou temos que chamá-lo duas vezes por mês e ano separadamente
mokNathal
2
O que você está tentando fazer? Apenas pegue uma corda? Em seguida, use a função to_char com um formato de data que você precisa postgresql.org/docs/8.2/static/functions-formatting.html
MK.
181
to_char(timestamp, 'YYYY-MM')

Você diz que o pedido não está "certo", mas não consigo ver por que está errado (pelo menos até chegar o ano 10000).

Yairchu
fonte
se você estiver trabalhando com "timestamp" to_char (to_timestamp (por exemplo, "timestamp"), 'MM-AAAA')
Bruno Lee
@BrunoMarinho se você quiser uma ordem cronológica, então não use 'MM-AAAA para fazer o pedido'. Se quiser que seja exibido, você ainda pode ter uma coluna nesse formato, mas não ordenar por ela
yairchu
4
Não entendo porque não é a resposta aceita.
Prabowo Murti de
Nesse caso, você não pode ORDER BYnamorar.
aagjalpankaj
1
@Aviator: Você pode usar ORDER BY to_char(timestamp, 'YYYY-MM'). Ou, alternativamente, se você fez, SELECT to_char(timestamp, 'YYYY-MM') AS datevocê pode simplesmente usar ORDER BY date.
yairchu
38

Use o date_truncmétodo para truncar o dia (ou qualquer outra coisa que você quiser, por exemplo, semana, ano, dia, etc.)

Exemplo de agrupamento de vendas de pedidos por mês:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;
Gerry Shaw
fonte
1
Está certo. Você pode usar para comparar: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm AAAA')
Alejandro Salamanca Mazuelo
Duas vezes mais rápido do que "to_char (timestamp, 'YYYY-MM')", o que também é bom.
Le Droid
20

Você pode truncar todas as informações após o mês usando date_trunc(text, timestamp):

select date_trunc('month',created_at)::date as date 
from orders 
order by date DESC;


Exemplo:

entrada:

created_at = '2019-12-16 18:28:13'

Produto 1:

date_trunc('day',created_at)
// 2019-12-16 00:00:00

Produto 2:

date_trunc('day',created_at)::date 
// 2019-12-16

Produto 3:

date_trunc('month',created_at)::date 
// 2019-12-01

Produto 4:

date_trunc('year',created_at)::date 
// 2019-01-01
Aya
fonte
16

1ª Opção

date_trunc('month', timestamp_column)::date

Ele manterá o formato de data com todos os meses começando no primeiro dia.

Exemplo:

2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2017-01-01

2ª Opção

to_char(timestamp_column, 'YYYY-MM')

Esta solução proposta por @yairchu funcionou bem no meu caso. Eu realmente queria descartar as informações do 'dia'.

Luís Martins
fonte
11

Você pode usar a função EXTRACT pgSQL

EX- date = 1981-05-31
EXTRACT(MONTH FROM date)
it will Give 05

Para mais detalhes PGSQL Data-Hora

Singhak
fonte
1

Ele está trabalhando para funções "maiores que" e não por menos que.

Por exemplo:

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) > '2000' limit 10;

está funcionando bem.

mas pelo

select date_part('year',txndt)
from "table_name"
where date_part('year',txndt) < '2000' limit 10;

Estou recebendo um erro.

Anurag Bhardwaj
fonte
Ele está trabalhando para funções maiores que não menos que. Por exemplo: selecione date_part ('year', txndt) FROM "table_name" onde date_part ('year', txndt)> '2000' limit 10; está funcionando bem. mas para selecionar date_part ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" onde date_part ('year', txndt) <'2000' limit 10; Estou recebendo um erro.
Anurag Bhardwaj
1
Isso não é uma resposta - se você tiver uma pergunta, poste uma nova pergunta em vez de adicioná-la como resposta.
Markoorn