Estrai la data (aaaa / mm / gg) da un timestamp in PostgreSQL


250

Voglio estrarre solo la parte della data da un timestamp in PostgreSQL.

Ho bisogno che sia un DATEtipo postgresql in modo da poterlo inserire in un'altra tabella che prevede un DATEvalore.

Ad esempio, se ho 2011/05/26 09:00:00, voglio2011/05/26

Ho provato a lanciare, ma ho solo il 2011:

timestamp:date
cast(timestamp as date)

Ho provato to_char()con to_date():

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

Ho provato a renderlo una funzione:

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

Qual è il modo migliore per estrarre la data (aaaa / mm / gg) da un timestamp in PostgreSQL?

Risposte:


432

Puoi trasmettere il timestamp a una data con il suffisso ::date. Ecco, in psql, un timestamp:

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

Ora lo lanceremo ad una data:

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

D'altra parte è possibile utilizzare la date_truncfunzione. La differenza tra loro è che quest'ultimo restituisce lo stesso tipo di dati come timestamptzmantenere intatto il fuso orario (se necessario).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)

3
non funziona, ho appena provato "seleziona '2010-01-01 12:00:00' :: timestamp :: date;" . restituisce solo l'anno 2011. Avevo già provato date (timestamp) e (timestamp) :: date ma ottengo solo la parte dell'anno in cambio, non la data completa di cui ho bisogno.
keren,

1
@kerenk, ora è strano. L'hai provato in psql?
Wayne Conrad,

40
@keren, psql è un'utilità da riga di comando - non la stai usando (ma la consideri). Quando si esegue la query in pgadmin3, guardare il riquadro di output dei dati. Puoi ridimensionare le colonne; la dimensione della colonna predefinita è troppo corta per mostrare l'intera data e mostra solo l'anno. Usa il mouse per espandere quella colonna e dovresti vedere tutto.
Wayne Conrad,

11
omg hai ragione. Mi sento così stupido. Grazie per segnalarlo.
keren,

Un caso in cui mi sono imbattuto in questo non funziona è in Scoiattolo. Con questa sintassi, Squirrel ti darà una casella di input per inserire i valori dei parametri per il parametro ": date".
James Kingsbery,

104

Usa la funzione data :

select date(timestamp_field) from table

Dalla rappresentazione di un campo di caratteri a una data è possibile utilizzare:

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

Codice di prova:

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;

Risultato del test:

risultato pgAdmin

risultato pgAdmin ampio


1
l'ho provato ma ho solo il 2011 in cambio invece della data completa come il
26/05/2011

Ho capito che non stai lavorando con un tipo di dati di agenda. Revisionato per funzionare con una rappresentazione in formato stringa di un timestamp nel formato fornito.
James Allman,

Come stai eseguendo il sql? psql?
James Allman,

sto usando pgAdmin III postgresSQL
keren

11
Ho notato che quando eseguo un test in pgAdmin III la colonna 'data' è abbastanza ampia da visualizzare l'anno. Prendi la maniglia della colonna ed espandi la colonna per vedere la data completa.
James Allman,

10

Hai provato a lanciarlo ad un appuntamento, con <mydatetime>::date?


1
Funziona benissimo. Come notato nei commenti sulla risposta di Wayne Conrad, keren fu sviato da una colonna eccessivamente stretta nel riquadro di output di pgAdmin.
KenB,

9

Questo funziona per me in Python 2.7

 select some_date::DATE from some_table;

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)

Un altro kit di test:

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

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)

ho appena provato il tuo in pgAdmin ma solo il 2011 non ha la data completa di cui avevo bisogno! :(
keren,

@keren: che dire di SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski

forse ha qualcosa a che fare con la formattazione del valore di output. Sto pensando che il valore di ritorno probabilmente ha giorno e mese, ma non è mostrato sullo schermo?
keren,

digitando SHOW datestyle; game me "ISO,
DMY

4

Basta fare select date(timestamp_column)e otterresti l'unica parte della data. A volte fare select timestamp_column::datepuò tornare date 00:00:00dove non rimuove la 00:00:00parte. Ma ho visto date(timestamp_column)funzionare perfettamente in tutti i casi. Spero che questo ti aiuti.


3

In postgres semplicemente: TO_CHAR (timestamp_column, 'GG / MM / AAAA') come submission_date

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.