Su solución propuesta es correcta. O más precisamente, es una de varias implementaciones correctas. Cualquiera de los siguientes funcionaría:
- Almacene la marca de tiempo UTC en un campo, almacene la compensación en otro.
- Almacenar la marca de tiempo local en un campo, almacene el desplazamiento en otro.
- Almacenar la
date
local en un campo y almacenar unatime with time zone
en otro. (aunquetime with time zone
generalmente se desaconseja...) - Almacene las marcas de tiempo UTC en un campo y la marca de tiempo local en otro.
El más fácil con diferencia es el primero, que ya propusiste.
Evitaría almacenar marcas de tiempo en text
campos, ya que tienden a no ser muy eficientes en la búsqueda.
También tenga en cuenta:si proviene de un entorno de SQL Server, puede recordar su datetimeoffset
type, que almacena la fecha y hora local y el desplazamiento en el campo, y usa el equivalente UTC durante la indexación. Es común pensar que la timestamp with time zone
de Postgres y MySQL tendrían el mismo comportamiento, pero no lo tienen. Simplemente usan la sesión zona horaria para convertir a/desde UTC. SQL Server no tiene concepto de una zona horaria de sesión y, por lo tanto, la discrepancia.
Asegúrese de leer esta parte de los documentos de Postgres .