Extrahieren Sie das Datum (JJJJ / MM / TT) aus einem Zeitstempel in PostgreSQL

250

Ich möchte nur den Datumsteil aus einem Zeitstempel in PostgreSQL extrahieren.

Ich brauche es, um ein Postgresql- DATETyp zu sein, damit ich es in eine andere Tabelle einfügen kann, die einen DATEWert erwartet .

Wenn ich zum Beispiel habe 2011/05/26 09:00:00, möchte ich2011/05/26

Ich habe versucht zu gießen, aber ich bekomme nur 2011:

timestamp:date
cast(timestamp as date)

Ich habe versucht to_char()mit to_date():

SELECT to_date(to_char(timestamp, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
FROM val3 WHERE id=1;

Ich habe versucht, daraus eine Funktion zu machen:

CREATE OR REPLACE FUNCTION testing() RETURNS void AS '
DECLARE i_date DATE;
BEGIN
    SELECT to_date(to_char(val1, "YYYY/MM/DD"),"YYYY/MM/DD") 
      INTO i_date FROM exampTable WHERE id=1;
    INSERT INTO foo(testd) VALUES (i);
END

Was ist der beste Weg, um ein Datum (JJJJ / MM / TT) aus einem Zeitstempel in PostgreSQL zu extrahieren?

keren
quelle

Antworten:

432

Sie können Ihren Zeitstempel auf ein Datum umwandeln, indem Sie ihn mit dem Suffix versehen ::date. Hier in psql ist ein Zeitstempel:

# select '2010-01-01 12:00:00'::timestamp;
      timestamp      
---------------------
 2010-01-01 12:00:00

Jetzt werden wir es auf ein Datum übertragen:

wconrad=# select '2010-01-01 12:00:00'::timestamp::date;
    date    
------------
 2010-01-01

Auf der anderen Seite können Sie die date_truncFunktion verwenden. Der Unterschied zwischen ihnen besteht darin, dass letzterer denselben Datentyp zurückgibt, wie timestamptzwenn Sie Ihre Zeitzone intakt halten (falls erforderlich).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)
Wayne Conrad
quelle
3
funktioniert nicht, nur versucht "select '2010-01-01 12:00:00' :: timestamp :: date;" . Es gibt nur das Jahr 2011 zurück. Ich habe bereits Datum (Zeitstempel) und (Zeitstempel) :: Datum ausprobiert, aber ich bekomme nur den Jahresteil zurück, nicht das vollständige Datum, das ich brauche.
Keren
1
@kerenk, das ist seltsam. Hast du es in psql versucht?
Wayne Conrad
40
@keren, psql ist ein Befehlszeilenprogramm - Sie verwenden es nicht (aber denken Sie darüber nach). Wenn Sie die Abfrage in pgadmin3 ausführen, sehen Sie sich den Datenausgabebereich an. Sie können die Größe der Spalten ändern. Die Standardspaltengröße ist zu kurz, um das gesamte Datum und nur das Jahr anzuzeigen. Verwenden Sie Ihre Maus, um diese Spalte zu erweitern, und Sie sollten das Ganze sehen.
Wayne Conrad
11
omg du hast recht Ich fühle mich so dumm. Vielen Dank für den Hinweis.
Keren
Ein Fall, in dem ich darauf gestoßen bin, wo dies nicht funktioniert, ist in Squirrel. Mit dieser Syntax gibt Ihnen Squirrel ein Eingabefeld zur Eingabe von Parameterwerten für den Parameter ": date".
James Kingsbery
104

Verwenden Sie die Datumsfunktion :

select date(timestamp_field) from table

Von einer Zeichenfelddarstellung bis zu einem Datum können Sie Folgendes verwenden:

select date(substring('2011/05/26 09:00:00' from 1 for 10));

Testcode:

create table test_table (timestamp_field timestamp);
insert into test_table (timestamp_field) values(current_timestamp);
select timestamp_field, date(timestamp_field) from test_table;

Testergebnis:

pgAdmin Ergebnis

pgAdmin Ergebnis breit

James Allman
quelle
1
Ich habe das versucht, aber ich bekomme nur 2011 als Gegenleistung anstelle des vollen Datums wie 2011/05/26
keren
Mir wurde klar, dass Sie nicht mit einem Zeitstempeldatentyp arbeiten. Überarbeitet, um mit einer Zeichenfolgendarstellung eines Zeitstempels in dem von Ihnen angegebenen Format zu arbeiten.
James Allman
Wie führen Sie die SQL aus? psql?
James Allman
Ich benutze pgAdmin III postgresSQL
keren
11
Als ich einen Test in pgAdmin III durchführte, bemerkte ich, dass die Spalte 'Datum' nur breit genug ist, um das Jahr anzuzeigen. Nehmen Sie den Spaltengriff und erweitern Sie die Spalte, um das vollständige Datum anzuzeigen.
James Allman
10

Haben Sie versucht, es auf ein Date mit zu <mydatetime>::datebesetzen?

leonbloy
quelle
1
Das funktioniert gut. Wie in den Kommentaren zu Wayne Conrads Antwort erwähnt, wurde keren von einer übermäßig schmalen Spalte im Ausgabebereich von pgAdmin in die Irre geführt.
KenB
9

Dies funktioniert bei mir in Python 2.7

 select some_date::DATE from some_table;
thedarkgriff
quelle
4
CREATE TABLE sometable (t TIMESTAMP, d DATE);
INSERT INTO sometable SELECT '2011/05/26 09:00:00';
UPDATE sometable SET d = t; -- OK
-- UPDATE sometable SET d = t::date; OK
-- UPDATE sometable SET d = CAST (t AS date); OK
-- UPDATE sometable SET d = date(t); OK
SELECT * FROM sometable ;
          t          |     d      
---------------------+------------
 2011-05-26 09:00:00 | 2011-05-26
(1 row)

Ein weiteres Testkit:

SELECT pg_catalog.date(t) FROM sometable;
    date    
------------
 2011-05-26
(1 row)

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
Grzegorz Szpetkowski
quelle
Ich habe gerade deine in pgAdmin ausprobiert, aber d hat nur 2011 nicht das volle Datum, das ich brauchte! :(
keren
@keren: Was ist mit SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski
Vielleicht hat es etwas mit der Formatierung des Ausgabewerts zu tun. Ich denke, dass der Rückgabewert wahrscheinlich Tag und Monat enthält, aber er wird einfach nicht auf Geröll angezeigt?
Keren
Eingabe im SHOW-Datenstil; Spiel mich "ISO, DMY"
keren
4

Tun select date(timestamp_column)Sie es einfach und Sie würden den einzigen Teil des Datums erhalten. Manchmal select timestamp_column::datekehrt date 00:00:00das Tun dorthin zurück, wo das 00:00:00Teil nicht entfernt wird . Aber ich habe gesehen date(timestamp_column), dass es in allen Fällen perfekt funktioniert. Hoffe das hilft.

Koushik Das
quelle
3

In postgres einfach: TO_CHAR (timestamp_column, 'TT / MM / JJJJ') als Übermittlungsdatum

Elmira Behzad
quelle