Wie extrahiere ich Jahr und Monat aus dem Datum in PostgreSQL, ohne die Funktion to_char () zu verwenden?

103

Ich möchte sql: auswählen SELECT "year-month" from table group by "year-month" AND order by date, wobei Jahr-Monat - Format für Datum "1978-01", "1923-12". Wählen Sie to_char von couse work , aber nicht "richtige" Reihenfolge:

to_char(timestamp_column, 'YYYY-MM')
Bdfy
quelle
1
Warum stimmt die Bestellung mit to_char nicht?
Yairchu
1
Die Abstimmung zum Schließen ist unklar, da nicht klar ist, warum to_char () nicht akzeptabel ist.
Alex R

Antworten:

66
date_part(text, timestamp)

z.B

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.
quelle
5
Wie man Monat und Jahr auf einmal extrahiert?
Können
3
date_part ('month', timestamp '2001-02-16 20:38:40'), date_part ('year', timestamp '2001-02-16 20:38:40')
MK.
Vielen
2
Was versuchst du zu machen? Nur eine Schnur bekommen? Verwenden Sie dann die Funktion to_char mit einem Datumsformat, das Sie benötigen. Postgresql.org/docs/8.2/static/functions-formatting.html
MK.
181
to_char(timestamp, 'YYYY-MM')

Sie sagen, dass die Reihenfolge nicht "richtig" ist, aber ich kann nicht verstehen, warum sie falsch ist (zumindest bis das Jahr 10000 kommt).

Yairchu
quelle
Wenn Sie mit "Zeitstempel" to_char (to_timestamp (z. B. "Zeitstempel"), 'MM-JJJJ') arbeiten
Bruno Lee
@BrunoMarinho Wenn Sie eine chronologische Reihenfolge wünschen, verwenden Sie einfach nicht 'MM-JJJJ zum Bestellen'. Wenn Sie möchten, dass das angezeigt wird, können Sie immer noch eine Spalte in diesem Format haben, aber nicht danach bestellen
yairchu
4
Ich verstehe nicht, warum es nicht die akzeptierte Antwort ist.
Prabowo Murti
In diesem Fall können Sie nicht ORDER BYdatieren.
Aagjalpankaj
1
@Aviator: Sie können verwenden ORDER BY to_char(timestamp, 'YYYY-MM'). Oder alternativ, wenn Sie dies getan haben SELECT to_char(timestamp, 'YYYY-MM') AS date, können Sie es einfach verwenden ORDER BY date.
Yairchu
38

Verwenden Sie die date_truncMethode, um den Tag abzuschneiden (oder was auch immer Sie möchten, z. B. Woche, Jahr, Tag usw.)

Beispiel für die Gruppierung von Verkäufen aus Bestellungen nach Monat:

select
  SUM(amount) as sales,
  date_trunc('month', created_at) as date
from orders
group by date
order by date DESC;
Gerry Shaw
quelle
1
Das stimmt. Sie können verwenden, um zu vergleichen: Datum (date_trunc ('Monat', jetzt ())) = to_Date (5 :: varchar || '' || 2017 :: varchar, 'mm JJJJ')
Alejandro Salamanca Mazuelo
Zweimal so schnell wie "to_char (Zeitstempel, 'JJJJ-MM')", was auch gut ist.
Le Droid
20

Sie können alle Informationen nach dem Monat abschneiden, indem Sie date_trunc(text, timestamp):

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


Beispiel:

Eingabe:

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

Ausgabe 1:

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

Ausgabe 2:

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

Ausgabe 3:

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

Ausgabe 4:

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

1. Option

date_trunc('month', timestamp_column)::date

Das Datumsformat wird für alle Monate ab dem ersten Tag beibehalten.

Beispiel:

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

2. Option

to_char(timestamp_column, 'YYYY-MM')

Diese von @yairchu vorgeschlagene Lösung hat in meinem Fall gut funktioniert. Ich wollte unbedingt 'Tages'-Informationen verwerfen.

Luis Martins
quelle
11

Sie können die EXTRACT-Funktion pgSQL verwenden

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

Weitere Informationen PGSQL Datum-Uhrzeit

Singhak
quelle
1

Es funktioniert für "größer als" Funktionen nicht für weniger als.

Beispielsweise:

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

funktioniert gut.

aber für

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

Ich bekomme einen Fehler.

Anurag Bhardwaj
quelle
Es funktioniert für mehr als Funktionen, nicht für weniger als. Beispiel: Wählen Sie date_part ('year', txndt) FROM "table_name", wobei date_part ('year', txndt)> '2000' limit 10; funktioniert gut. aber für select date_part ('year', txndt) FROM "hpi_validator_q3". "cdm_inv_exceptions" wobei date_part ('year', txndt) <'2000' limit 10; Ich bekomme einen Fehler.
Anurag Bhardwaj
1
Dies ist keine Antwort. Wenn Sie eine Frage haben, stellen Sie lieber eine neue Frage, als Ihre Frage als Antwort hinzuzufügen.
Markoorn