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?

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)

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


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?


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


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)

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


3

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.