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

Cómo funciona la función timezone() en PostgreSQL

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.