¿Cómo extraer el año y el mes de la fecha en PostgreSQL sin usar la función to_char ()?

104

Quiero seleccionar sql : SELECT "year-month" from table group by "year-month" AND order by date, donde año-mes - formato para la fecha "1978-01", "1923-12". seleccione to_char de trabajo couse , pero no orden "correcto":

to_char(timestamp_column, 'YYYY-MM')
Bdfy
fuente
1
¿Por qué el orden no es correcto con to_char?
yairchu
1
Votar para cerrar porque no está claro porque no está claro por qué to_char () no es aceptable.
Alex R

Respuestas:

68
date_part(text, timestamp)

p.ej

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.
fuente
5
¿Cómo extraer mes y año a la vez? ¿Puede mostrar un ejemplo
mokNathal
3
parte_fecha ('mes', marca de tiempo '2001-02-16 20:38:40'), parte_fecha ('año', marca de tiempo '2001-02-16 20:38:40')
MK.
gracias por una respuesta rápida, pero no podemos hacerlo en una sola función o tenemos que llamarlo dos veces por mes y año por separado
mokNathal
2
¿que estás tratando de hacer? ¿Solo tienes una cuerda? Luego use la función to_char con un formato de fecha que necesite postgresql.org/docs/8.2/static/functions-formatting.html
MK.
181
to_char(timestamp, 'YYYY-MM')

Dices que el orden no es "correcto", pero no veo por qué está mal (al menos hasta que llegue el año 10000).

yairchu
fuente
si está trabajando con "timestamp" to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')
Bruno Lee
@BrunoMarinho, si quieres un orden cronológico, no uses 'MM-AAAA para ordenar'. Si desea que se muestre, aún puede tener una columna en ese formato, pero no ordene por ella
yairchu
4
No entiendo por qué no es la respuesta aceptada.
Prabowo Murti
En este caso, no puedes tener ORDER BYcitas.
aagjalpankaj
1
@Aviator: puede usar ORDER BY to_char(timestamp, 'YYYY-MM'). O alternativamente, si lo hizo SELECT to_char(timestamp, 'YYYY-MM') AS date, puede simplemente usar ORDER BY date.
yairchu
38

Utilice el date_truncmétodo para truncar el día (o cualquier otra cosa que desee, por ejemplo, semana, año, día, etc.)

Ejemplo de agrupación de ventas de pedidos por mes:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;
Gerry Shaw
fuente
1
Así es. U puede usar para comparar: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo
Dos veces más rápido que "to_char (timestamp, 'YYYY-MM')", que también es bueno.
Le Droid
20

Puede truncar toda la información después del mes usando date_trunc(text, timestamp):

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


Ejemplo:

Entrada:

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

Salida 1:

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

Salida 2:

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

Salida 3:

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

Salida 4:

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

Primera opción

date_trunc('month', timestamp_column)::date

Mantendrá el formato de fecha con todos los meses a partir del día uno.

Ejemplo:

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

Segunda opción

to_char(timestamp_column, 'YYYY-MM')

Esta solución propuesta por @yairchu funcionó bien en mi caso. Tenía muchas ganas de descartar la información del "día".

Luis Martins
fuente
11

Puede utilizar la función EXTRACT pgSQL

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

Para más detalles PGSQL Date-Time

Singhak
fuente
1

Está trabajando para funciones "mayor que" no menos que.

Por ejemplo:

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

está funcionando bien.

pero para

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

Recibo un error.

Anurag Bhardwaj
fuente
Está trabajando para funciones superiores a no menos de. Por ejemplo: seleccione date_part ('year', txndt) FROM "table_name" donde date_part ('year', txndt)> '2000' límite 10; está funcionando bien. pero para seleccionar date_part ('año', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" donde date_part ('año', txndt) <'2000' límite 10; Recibo un error.
Anurag Bhardwaj
1
Esta no es una respuesta; si tiene una pregunta, publique una nueva pregunta en lugar de agregar su pregunta como respuesta.
Markoorn