Come estrarre anno e mese dalla data in PostgreSQL senza utilizzare la funzione to_char ()?


104

Voglio selezionare sql SELECT "year-month" from table group by "year-month" AND order by date:, dove anno-mese - formato per la data "1978-01", "1923-12". seleziona to_char del lavoro svolto , ma non l'ordine "corretto":

to_char(timestamp_column, 'YYYY-MM')

1
Perché l'ordine non è corretto con to_char?
yairchu

1
La votazione per la chiusura non è chiara perché non è chiaro il motivo per cui to_char () non è accettabile.
Alex R

Risposte:


68
date_part(text, timestamp)

per esempio

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


5
come estrarre mese e anno contemporaneamente? puoi mostrare un esempio
mokNathal

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

grazie per la risposta rapida, ma non possiamo farlo in una singola funzione o dobbiamo chiamarlo due volte per mese e anno separatamente
mokNathal

2
Cosa stai cercando di fare? Hai appena ricevuto una stringa? Quindi usa la funzione to_char con un formato di data che ti serve postgresql.org/docs/8.2/static/functions-formatting.html
MK.

181
to_char(timestamp, 'YYYY-MM')

Dici che l'ordine non è "giusto", ma non riesco a capire perché sia ​​sbagliato (almeno fino a quando non arriva l'anno 10000).


se stai lavorando con "timestamp" to_char (to_timestamp (e. "timestamp"), 'MM-YYYY')
Bruno Lee

@BrunoMarinho se desideri un ordine cronologico, non utilizzare "MM-YYYY per ordinare". Se vuoi che
venga

4
Non capisco perché non è la risposta accettata.
Prabowo Murti

In questo caso, non puoi ORDER BYuscire con qualcuno .
aagjalpankaj

1
@ Aviator: puoi usare ORDER BY to_char(timestamp, 'YYYY-MM'). O in alternativa, se lo hai fatto SELECT to_char(timestamp, 'YYYY-MM') AS date, puoi semplicemente usare ORDER BY date.
yairchu

38

Utilizza il date_truncmetodo per troncare il giorno (o qualsiasi altra cosa desideri, ad esempio, settimana, anno, giorno, ecc.)

Esempio di raggruppamento delle vendite dagli ordini per mese:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;

1
Giusto. Puoi usare per confrontare: date (date_trunc ('month', now ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm YYYY')
Alejandro Salamanca Mazuelo

Due volte più veloce di "to_char (timestamp, 'YYYY-MM')", che è anche un bene.
Le Droid

20

Puoi troncare tutte le informazioni dopo il mese utilizzando date_trunc(text, timestamp):

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


Esempio:

Input:

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

Uscita 1:

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

Uscita 2:

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

Uscita 3:

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

Uscita 4:

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

16

1a opzione

date_trunc('month', timestamp_column)::date

Manterrà il formato della data con tutti i mesi a partire dal primo giorno.

Esempio:

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

2a opzione

to_char(timestamp_column, 'YYYY-MM')

Questa soluzione proposta da @yairchu ha funzionato bene nel mio caso. Volevo davvero scartare le informazioni del "giorno".


11

È possibile utilizzare la funzione ESTRATTA pgSQL

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

Per maggiori dettagli PGSQL Date-Time


1

Funziona per funzioni "maggiore di" non per minore di.

Per esempio:

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

funziona bene.

ma per

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

Ricevo un errore.


Funziona per funzioni maggiori di non per minori. Ad esempio: select date_part ('year', txndt) FROM "table_name" dove date_part ('year', txndt)> '2000' limit 10; funziona bene. ma per select date_part ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" dove date_part ('year', txndt) <'2000' limit 10; Ricevo un errore.
Anurag Bhardwaj

1
Questa non è una risposta: se hai una domanda, pubblica una nuova domanda piuttosto che aggiungere la tua domanda come risposta.
Markoorn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.