En PostgreSQL, puede usar timezone()
función para convertir una marca de tiempo a otra zona horaria.
Sintaxis
La sintaxis es así:
timezone(zone, timestamp)
Donde zone
es la zona horaria en la que desea la timestamp
argumento a convertir.
El resultado que obtenga dependerá de si el valor de marca de tiempo original incluye una zona horaria o no (y cuál es ese valor).
Ejemplo 1:cuando la marca de tiempo original SÍ incluye la zona horaria
Esto es lo que sucede cuando la marca de tiempo original incluye la zona horaria.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Resultado:
2020-10-25 04:00:00
Cuando la marca de tiempo original incluye la zona horaria, el timezone()
La función cambia el valor de la marca de tiempo original a la zona horaria especificada y devuelve el valor sin una zona horaria.
Esto es lo que sucede si cambio la zona horaria de la marca de tiempo de entrada.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Resultado:
2020-10-25 03: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 el valor de la marca de tiempo original se cambia a la zona horaria local.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Resultado:
2020-10-24 18:00:00
En este caso, la marca de tiempo resultante se ha retrasado seis horas. Esto significa que mi zona horaria local está seis horas por delante de India/Mauricio.
Podemos ver el desplazamiento de la zona horaria que se utilizó seleccionando el valor de entrada directamente.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Resultado:
2020-10-25 00:00:00+10
Ejemplo 2:cuando la marca de tiempo original NO incluye la zona horaria
Esto es lo que sucede cuando la marca de tiempo original no incluir una zona horaria.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Resultado:
2020-10-25 06:00:00+10
Cuando la marca de tiempo original no incluye una zona horaria, el resultado se muestra usando 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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Resultado:
2020-10-25 06: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 '2020-10-25 00:00:00+12';
Resultado:
2020-10-25 00:00:00
Ejemplo 3:marca de tiempo local
Usemos el localtimestamp
función para ejecutar una comparación entre la marca de tiempo actual en mi propia zona horaria y la marca de tiempo resultante después de usar timezone()
función para convertirlo a una zona horaria diferente.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Resultado:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
La localtimestamp
la función devuelve una marca de tiempo tipo de datos, que viene con un implícito "sin zona horaria". En otras palabras, marca de tiempo y marca de tiempo sin zona horaria son lo mismo.
Como se demostró anteriormente, cuando no se especifica ninguna zona horaria en la marca de tiempo original, la TimeZone
actual se utiliza la configuración y se añade al resultado. Y eso es lo que obtenemos cuando usamos localtimestamp
.
Por cierto, en este ejemplo usé \x
para mostrar el resultado usando una pantalla expandida/salida vertical, solo para que sea más fácil de leer.
Ejemplo 4:marca de tiempo_actual
Ahora usemos el current_timestamp
función en lugar de localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Resultado (usando salida vertical):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Esta vez, el desplazamiento de la zona horaria se ha agregado a la marca de tiempo original y el timezone()
resultado ya no lo incluye.
Obtenemos este resultado porque current_timestamp
la función devuelve una marca de tiempo con zona horaria tipo de datos.
Ejemplo 5:uso de valores de tiempo
La timezone()
la función también funciona con time
valores (time with time zone
y time without time zone
).
Sin embargo, cuando se usa en time with time zone
valores, el desplazamiento de la zona horaria se agrega al resultado.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Resultado (usando salida vertical):
timezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
Y para completar, aquí están esos mismos valores usando un time without time zone
tipo de datos.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Resultado (usando salida vertical):
timezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Verifique la zona horaria local
Si desea verificar su propia zona horaria local, ejecute SHOW TIMEZONE
.
Esto es lo que obtengo cuando ejecuto ese comando.
SHOW TIMEZONE;
Resultado:
Australia/Brisbane
Comprobar la compensación de la zona horaria
Armado con el conocimiento anterior, ahora puedo verificar las dos compensaciones de zona horaria consultando pg_timezone_names
ver.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Resultado (usando salida vertical):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Consulte Devolver una lista de zonas horarias admitidas por PostgreSQL para obtener más opciones y ejemplos para devolver la zona horaria en Postgres.