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

Cómo funciona AT TIME ZONE en PostgreSQL

En PostgreSQL, puede usar AT TIME ZONE cláusula para convertir una marca de tiempo a otra zona horaria.

Sintaxis

Puedes usarlo con cualquiera de las siguientes tres variantes:

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Donde zone es la zona horaria a la que desea que se convierta el valor de la izquierda.

Para que quede claro, la única diferencia entre las tres variantes está en el tipo de datos de la marca de tiempo que se convertirá.

Los tres tipos de datos son:

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

El resultado que obtenga dependerá del tipo de datos.

La siguiente tabla describe el resultado que produce cada variante.

Expresión Tipo de devolución Descripción
marca de tiempo con zona horaria EN ZONA HORARIA zone timestamp without time zone Convertir marca de tiempo dada con zona horaria a la nueva zona horaria, sin designación de zona horaria
marca de tiempo sin zona horaria EN ZONA HORARIA zone timestamp with time zone Tratar la marca de tiempo dada sin zona horaria como ubicado en la zona horaria especificada
hora con zona horaria EN ZONA HORARIA zone time with time zone Convertir hora dada con zona horaria a la nueva zona horaria

Variante 1

Esto es lo que sucede cuando conviertes una timestamp with time zone valor.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Resultado:

2025-11-20 02:00:00

Cuando la marca de tiempo original es una timestamp with time zone valor, se desplaza a la zona horaria especificada y el resultado se devuelve sin una compensación de zona horaria.

Esto es lo que sucede si cambio el desplazamiento de la zona horaria del valor de entrada.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Resultado:

2025-11-20 01:00:00

La marca de tiempo resultante cambia según la zona horaria de entrada.

Y si especifica timestamp with time zone , pero la marca de tiempo original en realidad no incluye una zona horaria, entonces se asume la zona horaria local.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:

2025-11-19 16:00:00

En este caso, la marca de tiempo resultante se ha retrasado ocho horas. Esto significa que mi zona horaria local está ocho horas por delante de África/Cairo.

Podemos ver el desplazamiento de la zona horaria que se utilizó seleccionando el valor de entrada directamente.

SELECT timestamp with time zone '2025-11-20 00:00:00';

Resultado:

2025-11-20 00:00:00+10

Variante 2

Esto es lo que sucede cuando la marca de tiempo original usa una timestamp without time zone valor.

En otras palabras, no incluir una zona horaria.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:

2025-11-20 08:00:00+10

Cuando la marca de tiempo original no incluye una zona horaria, el resultado se muestra utilizando la TimeZone actual se agrega la configuración y el desplazamiento de la zona horaria.

Esto se aplica cada vez que especifica timestamp without time zone , incluso si la marca de tiempo contiene un desplazamiento de zona horaria.

SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Resultado:

2025-11-20 08:00:00+10

Esto es de esperar, porque si selecciono solo la timestamp without time zone valor, esto es lo que obtengo:

SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Resultado:

2025-11-20 00:00:00

Variante 3

Esto es lo que sucede cuando la marca de tiempo original usa una time with time zone valor.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Resultado:

02:00:00+02

Convierte el time with time zone valor a la nueva zona horaria y agrega el desplazamiento de la zona horaria al resultado.

Esto es lo que sucede si cambio el desplazamiento de la zona horaria del valor de entrada.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Resultado:

01:00:00+02

La marca de tiempo resultante cambia según la zona horaria de entrada.

Y si especifica time with time zone , pero la marca de tiempo original en realidad no incluye una zona horaria, se asume la zona horaria local.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:

16:00:00+02

En este caso, la marca de tiempo resultante se retrasó ocho horas (porque mi zona horaria local está ocho horas por delante de África/El Cairo).

Podemos ver el desplazamiento de la zona horaria que se utilizó seleccionando el valor de entrada directamente.

SELECT time with time zone '00:00:00';

Resultado:

00:00:00+10

Hora sin zona horaria

Aunque la documentación de Postgres no incluye una time without time zone variante, aquí hay un ejemplo de todos modos.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Resultado:

16:00:00+02

Entonces, en este ejemplo, se asumió la zona horaria local para convertir la zona horaria.