Extraer la fecha (aaaa / mm / dd) de una marca de tiempo en PostgreSQL

250

Quiero extraer solo la parte de fecha de una marca de tiempo en PostgreSQL.

Necesito que sea un DATEtipo postgresql para poder insertarlo en otra tabla que espere un DATEvalor.

Por ejemplo, si tengo 2011/05/26 09:00:00, quiero2011/05/26

Intenté lanzar, pero solo consigo 2011:

timestamp:date
cast(timestamp as date)

Lo intenté to_char()con to_date():

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

Traté de hacerlo una función:

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

¿Cuál es la mejor manera de extraer la fecha (aaaa / mm / dd) de una marca de tiempo en PostgreSQL?

keren
fuente

Respuestas:

432

Puede enviar su marca de tiempo a una fecha con el sufijo ::date. Aquí, en psql, hay una marca de tiempo:

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

Ahora lo enviaremos a una fecha:

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

Por otro lado, puedes usar la date_truncfunción. La diferencia entre ellos es que este último devuelve el mismo tipo de datos, como timestamptzmantener intacta su zona horaria (si la necesita).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)
Wayne Conrad
fuente
3
no funciona, simplemente intenté "seleccionar '2010-01-01 12:00:00' :: timestamp :: date;" . vuelve solo el año 2011. Ya había intentado date (marca de tiempo) y (marca de tiempo) :: fecha pero solo obtengo la parte del año a cambio, no la fecha completa que necesito.
Keren
1
@kerenk, eso es extraño. ¿Lo probaste en psql?
Wayne Conrad
40
@keren, psql es una utilidad de línea de comandos: no la está usando (pero considérela). Cuando ejecute la consulta en pgadmin3, mire el panel de salida de datos. Puede cambiar el tamaño de las columnas; el tamaño de columna predeterminado es demasiado corto para mostrar la fecha completa y solo muestra el año. Usa el mouse para expandir esa columna y deberías ver todo.
Wayne Conrad
11
Dios mío, tienes razón. Me siento muy estupido. Gracias por mencionarlo.
Keren
Un caso que encontré donde esto no funciona es en Squirrel. Con esta sintaxis, Squirrel le dará un cuadro de entrada para ingresar valores de parámetros para el parámetro ": fecha".
James Kingsbery
104

Use la función de fecha :

select date(timestamp_field) from table

Desde una representación de campo de caracteres hasta una fecha que puede usar:

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

Código de prueba:

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;

Resultado de la prueba:

Resultado pgAdmin

Resultado pgAdmin amplio

James Allman
fuente
1
He intentado eso, pero solo obtengo 2011 a cambio en lugar de la fecha completa como 2011/05/26
keren
Me di cuenta de que no está trabajando con un tipo de datos de marca de tiempo. Revisado para trabajar con una representación de cadena de una marca de tiempo en el formato que proporcionó.
James Allman
¿Cómo estás ejecutando el sql? psql?
James Allman
Estoy usando pgAdmin III postgresSQL
keren
11
Noté que cuando realizo una prueba en pgAdmin III, la columna 'fecha' solo es lo suficientemente amplia como para mostrar el año. Tome el asa de la columna y expanda la columna para ver la fecha completa.
James Allman
10

¿Has intentado llevarlo a una cita con <mydatetime>::date?

leonbloy
fuente
1
Esto funciona bien. Como se señaló en los comentarios sobre la respuesta de Wayne Conrad, Keren se desvió por una columna excesivamente estrecha en el panel de salida de pgAdmin.
KenB
9

Esto funciona para mí en Python 2.7

 select some_date::DATE from some_table;
thedarkgriffen
fuente
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)

Otro kit de prueba:

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

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
Grzegorz Szpetkowski
fuente
¡Acabo de probar el tuyo en pgAdmin pero d solo tiene la fecha 2011 no completa que necesitaba! :(
keren
@keren: ¿qué pasa con SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski
tal vez tenga algo que ver con formatear el valor de salida. Estoy pensando que el valor de retorno probablemente tenga día y mes allí, pero simplemente no se muestra en la pantalla.
keren
escribiendo SHOW datestyle; juego "ISO, DMY"
keren
4

Solo hazlo select date(timestamp_column)y obtendrás la única parte de la fecha. A veces, hacer select timestamp_column::datepuede volver date 00:00:00donde no elimina la 00:00:00parte. Pero he visto date(timestamp_column)que funciona perfectamente en todos los casos. Espero que esto ayude.

Koushik Das
fuente
3

En postgres simplemente: TO_CHAR (timestamp_column, 'DD / MM / AAAA') como submit_date

Elmira Behzad
fuente