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

Cómo convertir cadena a marca de tiempo sin zona horaria

Representación de cadena de una timestamp (=timestamp without time zone ) depende de la configuración regional. Por lo tanto, para evitar ambigüedades que conduzcan a errores de datos o que Postgres presente una excepción, tiene dos opciones:

1.) Utilice el formato ISO 8601 , que funciona igual con any configuración regional o DateStyle ajuste:

'2013-08-20 14:52:49'

Es posible que deba convertir el literal de cadena explícitamente donde el tipo de datos no se puede derivar del contexto, según el caso de uso:

'2013-08-20 14:52:49'::timestamp

2.) Convierte la cadena a timestamp usando to_timestamp() con un patrón de plantilla coincidente:

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')

Esto devuelve timestamptz , asumiendo la configuración de zona horaria actual. Por lo general (como en una cesión) el tipo se coacciona en consecuencia. Para timestamp , esto significa que la compensación de tiempo se trunca y obtiene el valor esperado. Nuevamente, si el tipo de destino no se puede derivar del contexto, es posible que deba convertir explícitamente:

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp

Dado que eso simplemente elimina el desplazamiento de tiempo, da como resultado el valor esperado. O use el AT TIME ZONE construir con una zona horaria de su elección:

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'

Si bien la zona horaria de destino es la misma que su timezone actual entorno, no se produce ninguna transformación. De lo contrario, la marca de tiempo resultante se transpone en consecuencia. Lectura adicional:

  • Ignorar las zonas horarias por completo en Rails y PostgreSQL