it-swarm.com.de

Wie kann man einen Postgresql-Standardwert-Datumsstempel wie 'YYYYMM' setzen?

Wie kann ich als Titel einer Tabellenspalte den Standardwert für das aktuelle Jahr und den aktuellen Monat im Format 'YYYYMM' wie 200905 für heute festlegen?

35
Strae

Bitte beachten Sie, dass die Formatierung des Datums unabhängig von der Speicherung ist. Wenn es für Sie wesentlich ist, dass das Datum gespeichert in diesem Format ist, müssen Sie entweder einen benutzerdefinierten Datentyp definieren oder als String speichern. Dann können Sie eine Kombination aus extract , Typecasting und Verkettung verwenden, um dieses Format zu erhalten. 

Ich vermute jedoch, dass Sie ein Datum speichern und das Format bei der Ausgabe erhalten möchten. So etwas wird den Trick für Sie tun:

    CREATE TABLE my_table
    (
    id serial PRIMARY KEY not null,
    my_date date not null default CURRENT_DATE
    );

(CURRENT_DATE is basically a synonym for now() and a cast to date).

(Bearbeitet, um to_char zu verwenden).

Dann können Sie Ihre Ausgabe wie folgt erhalten:

SELECT id, to_char(my_date, 'yyyymm') FROM my_table;

Nun, wenn Sie did wirklich brauchen, müssen Sie dieses Feld als Zeichenfolge speichern und sicherstellen, dass das Format immer möglich ist:

CREATE TABLE my_other_table
(
id serial PRIMARY KEY not null,
my_date varchar(6) default to_char(CURRENT_DATE, 'yyyymm')
);
74
Nic Gibson

Für den Fall, dass Milen A. Radev nicht in der Lage ist, seine Lösung zu veröffentlichen, ist dies Folgendes:

CREATE TABLE foo (
    key     int PRIMARY KEY,
    foo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
14
Curt J. Sampson

Warum möchtest du das tun? 

IMHO sollten Sie das Datum als Standardtyp speichern und bei Bedarf die Umwandlung in das gewünschte Format abrufen.

Sie können das Format der Spalte jedoch mit einer Ansicht angeben. Ich kenne keine anderen Methoden.

bearbeitet:

Im Ernst, Sie sollten meiner Meinung nach eine Sicht auf diese Tabelle mit Datumstyp erstellen. Ich rede über so etwas: 

create table sample_table ( id serial primary key, timestamp date); 

und dann 

create view v_example_table as select id, to_char(date, 'yyyymmmm');

Und verwenden Sie v_example_table in Ihrer Anwendung. 

9
Marcin Cylke

Vielen Dank für alle, die geantwortet haben, und vielen Dank für diejenigen, die mir die Idee zum Funktionsformat gegeben haben. Ich werde sie wirklich für die zukünftige Verwendung studieren.

Für diesen expliziten Fall ist das 'spezielle JJJJMM-Feld' jedoch nicht als Datumsfeld zu betrachten, sondern nur als Tag, o was auch immer für den Abgleich mit dem genau untersuchten Jahr-Monat-Wert verwendet wird. Es gibt bereits ein anderes Datumsfeld mit dem vollständigen Zeitstempel, aber wenn ich alle Reihen von Januar 2008 brauche, denke ich, dass es schneller ist, eine Auswahl zu treffen

SELECT  [columns] FROM table WHERE yearmonth = '200801'

anstatt

SELECT  [columns] FROM table WHERE date BETWEEN DATE('2008-01-01') AND DATE('2008-01-31')
1
Strae

Es ist ein weit verbreitetes Missverständnis, dass Sie dies für die Leistung denormalisieren können. Verwenden Sie date_trunc('month', date) für Ihre Abfragen und fügen Sie einen Indexausdruck hinzu, wenn Sie feststellen, dass er langsam läuft.

0
Charlie Clark