2012-04-30 22 views
5

Estamos implementando nuestros propios medidores de flujo (muy parecido a este medidor USGS: http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600) para que los kayakistas sepamos si hay suficiente agua para remar la corriente y no pierda el tiempo y gas para conducir allí. Esperamos instalar algunos de estos en toda la región sureste de aguas blancas que abarca las zonas horarias oriental y central.Huso horario con horario de verano en PostgreSQL

Estoy almacenando el tiempo que se inserta un registro usando el valor predeterminado de current_time para la grabación. Me gustaría mostrar más tarde los datos usando el formato MM/DD/YYYY HH12:MI AM TZ, que produce lecturas como 03/12/2012 01:00 AM CDT. También me gustaría que la salida tenga en cuenta los cambios en el horario de ahorro de luz diurna, por lo que la última parte de la oración anterior cambiaría entre CST y CDT cuando 'avancemos' y 'retrocedamos'. Este cambio ocurrió el 3/11/2012 este año y he incluido fechas en ambos lados de esta línea de DST a continuación. Estoy usando mi computadora portátil con Windows 7 para el desarrollo y luego nos desplegaremos en una caja Unix. Postgres aparentemente ha detectado que mi computadora con Windows está configurada en la zona horaria del este de EE. UU. Estoy intentando esto con un campo 'timestamp without time zone' y un campo 'timestamp with time zone' pero no puedo hacer que funcione.

He intentado usar 'en la zona horaria' en mis selecciones y todo está funcionando hasta que sea hora de mostrar la zona horaria. La hora real es parte de la marca de tiempo se resta correctamente por una hora cuando solicito el tiempo en CDT. Pero EDT se muestra en la salida.

SELECT reading_time as raw, 
     reading_time at time zone 'CDT', 
     to_char(reading_time at time zone 'CDT', 
      'MM/DD/YYYY HH12:MI AM TZ') as formatted_time 
    FROM readings2; 

"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT" 
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT" 
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST" 
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST" 
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT" 

Estoy almacenando la zona horaria que cada uno de nuestros medidores se encuentra en un personaje que varía campo una tabla separada. Consideré agregar este valor al final del tiempo de salida, pero quiero que cambie de CST a CDT sin mi intervención.

Gracias por su ayuda.

+1

Sería útil si pudiera publicar la salida de 'psql''s' \ d lecturas2' aquí. – vyegorov

Respuesta

15

En lugar de utilizar nombres de zonas horarias como CDT o CST, puede considerar usar full Olsen-style time zone names. En el caso del tiempo central, puede elegir un huso horario. Cualquiera que coincida con su ubicación, como America/Chicago, o simplemente US/Central. Esto garantiza que PostgreSQL use la base de datos Olsen tz para determinar automáticamente si el horario de verano se aplica en cualquier fecha.

5

Definitivamente quiere una columna TIMESTAMP WITH TIME ZONE (que también se conoce como timestamptz en PostgreSQL). Eso almacenará la marca de tiempo en UTC, de modo que represente un momento particular en el tiempo. Contrariamente a lo que su nombre indica, hace no guarda un huso horario en la columna - puede ver la marca de tiempo recuperada en la zona horaria de su elección con la frase AT TIME ZONE.

La semántica de TIMESTAMP WITHOUT TIME ZONE es confusa y casi inútil. Recomiendo encarecidamente que no utilice ese tipo en absoluto para lo que está describiendo.

Estoy realmente confundido por la parte de la pregunta que habla sobre el almacenamiento de la marca de tiempo en una columna CHARACTER VARYING. Parece que podría ser parte del problema. Si puede almacenarlo en el timestamptz desde el principio, sospecho que tendrá menos problemas. Salvo eso, sería más seguro usar la notación -04 para la compensación de UTC; pero eso me parece más trabajo sin ningún beneficio.

+1

Para agregar su respuesta, aquí un enlace que trata este tema más profundo: http://phili.pe/posts/timestamps-and-time-zones-in-postgresql/ – jgburet

Cuestiones relacionadas