sql >> Base de Datos >  >> RDS >> PostgreSQL

en postgres, ¿puede establecer el formato predeterminado para una marca de tiempo, por sesión o globalmente?

En PostgreSQL, el formato de las marcas de tiempo es independiente del almacenamiento. Una respuesta es usar to_char y formatee la marca de tiempo en el formato que necesite en el momento en que lo necesite, así:

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;

Pero si debe establecer el formato predeterminado:

Cambiar el formato de marca de tiempo de postgresql globalmente:

Eche un vistazo a su zona horaria, ejecute esto como una consulta sql:

show timezone
Result: "US/Eastern"

Entonces, cuando imprima la marca de tiempo actual, verá esto:

select current_timestamp
Result: 2012-10-23 20:58:35.422282-04

El -04 al final es su zona horaria relativa a UTC. Puedes cambiar tu zona horaria con:

set timezone = 'US/Pacific'

Entonces:

select current_timestamp
Result: 2012-10-23 18:00:38.773296-07

Así que observe el -07 allí, eso significa que nosotros, el Pacífico, estamos a 7 horas de UTC. ¿Cómo hago para que esa antiestética zona horaria desaparezca? Una forma es simplemente hacer una tabla, por defecto es una marca de tiempo sin zona horaria:

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);

Luego, si agrega una marca de tiempo a esa tabla y la selecciona

select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146

sí, no hay zona horaria al final. ¡Pero desea tener más control sobre cómo se muestra la marca de tiempo de forma predeterminada! Podrías hacer algo como esto:

CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);

Es un campo de texto que le brinda más control sobre cómo se muestra de forma predeterminada cuando hace select somecolumns from sometable . Tenga en cuenta que puede enviar una cadena a la marca de tiempo:

select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789

Podría lanzar una marca de tiempo actual a timestamp que elimina la zona horaria:

select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047

Puedes deshacerte de la zona horaria así:

select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"

Pero si realmente quieres recuperar la zona horaria, puedes hacer esto:

select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04

Puedes sacar lo que quieras con extract:

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

Y esta monstruosidad:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40