2012-01-04 15 views
8

En Postgres, ¿es posible cambiar la máscara de formato predeterminada para una marca de tiempo?en postgres, ¿puede establecer el formato predeterminado para una marca de tiempo, por sesión o globalmente?

ahora vuelve como

2012-01-03 20:27:53.611489 

quisiera resolución al minuto siguiente manera:

2012-01-03 20:27 

Sé que puedo hacer esto en columnas individuales con to_char() as o desnudé con un substr() por la aplicación receptora, pero tenerlo formateado correctamente inicialmente ahorraría mucho trabajo y reduciría muchos errores.

+0

aplicación cliente, que se utiliza? –

+0

prototipo en php, moviéndose a node.js en aproximadamente 6 mo –

+0

Entonces esta sería una configuración de php para cambiar, no una configuración de Postgres. –

Respuesta

4

En postgres, puede cambiar la máscara de formato predeterminada para las fechas y horas - utilizando la opción set datestyle; las opciones disponibles se pueden encontrar here (ver 8.5.2. Salida de fecha/hora).

Lamentablemente, todas las opciones disponibles incluyen la cantidad de segundos; por lo tanto, deberá volver a formatearlas en la consulta o en el código de la aplicación (si corresponde).

+0

está encontrando lo que encontré - gracias –

3

to_char() se utiliza para crear una cadena literal. Si quieres un valor de marca de tiempo diferente, utilice:

date_trunc('minute', now()) 

Para una entradaenmascarar puede utilizar:

to_timestamp('2012-01-03 20:27:53.611489', 'YYYY-MM-DD HH24:MI') 

moldeada a timestamp without time zone añadiendo ::timestamp.

Que yo sepa, no hay una configuración en PostgreSQL que recorte los segundos de los literales de la marca de tiempo de manera predeterminada.

+0

gracias, pero el problema no es el valor de la marca de tiempo, sino su representación de cadena cuando se selecciona. en esta aplicación, una marca de tiempo presentada al usuario siempre se redondea al minuto más cercano, teniendo que ver con mostrar, no con datos. estaba buscando una forma de hacer esto sin un 'to_char()' en cada columna de cada selección. –

+1

@ccyoung: si desea ** redondear ** al minuto más cercano, 'to_char()' tampoco lo ayudará. Solo puedes truncar con él. De todos modos, esto suena como un trabajo para el ** cliente **, no para la base de datos. a_horse_with_no_name está en el camino correcto. –

+0

teóricamente estoy seguro de que probablemente tengas razón, pero como práctica, casi siempre colocaste el formato de fecha y la aritmética en SQL, ya que es mucho mejor que javascript o php. –

8

En PostgreSQL, el formato de las marcas de tiempo es independiente del almacenamiento. Una respuesta es utilizar to_char y formatear la fecha y hora a cualquier formato que necesita en el momento 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 se debe establecer el formato predeterminado:

Cambiar la fecha y hora de PostgreSQL formato a nivel mundial:

Tome un vistazo a su zona horaria, ejecute esto como una consulta SQL:

show timezone 
Result: "US/Eastern" 

Así que cuando se está imprimiendo a cabo current_timestamp, ve esto:

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

El -04 al final es su zona horaria con respecto a UTC.Puede cambiar su zona horaria con:

set timezone = 'US/Pacific' 

continuación:

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

Así notar los -07 allí, eso significa que el Pacífico es de 7 horas de UTC. ¿Cómo puedo hacer que esa zona horaria antiestética desaparezca? Una forma es simplemente para hacer una tabla, el valor predeterminado es una marca de tiempo sin zona horaria:

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

A continuación, si se agrega una marca de tiempo a la tabla y seleccionar de que

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

yay, ninguna zona horaria en el fin. ¡Pero desea más control sobre cómo se muestra la marca de tiempo de forma predeterminada! Se podría 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 da más control sobre la forma en que aparece de forma predeterminada cuando se hace una select somecolumns from sometable. Aviso Puede convertir una cadena de marca de tiempo:

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

puedas jugar un current_timestamp a timestamp que elimina la zona horaria:

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

Usted puede deshacerse de la zona horaria de esta manera:

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

Pero si realmente quiere la zona horaria atrás, puede hacer esto:

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

Puede dar un tirón lo que quiere con extracto:

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 
Cuestiones relacionadas