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 | 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 | 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 | 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.