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')

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


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.


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).


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;

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

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.


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


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.