Definir la zona horaria predeterminada de una base de datos

Spanner proporciona funciones de fecha y marca de tiempo en GoogleSQL y Cloud SQL para PostgreSQL. Algunas funciones, como TIMESTAMP, dependen de la zona horaria y aceptan un parámetro de zona horaria opcional. Si no se proporciona ningún parámetro de zona horaria en una función, las bases de datos de Spanner usarán de forma predeterminada la zona horaria America/Los_Angeles.

Spanner te permite cambiar la zona horaria predeterminada de una base de datos para personalizar este comportamiento.

Limitaciones

  • Solo puedes cambiar la zona horaria de las bases de datos vacías que no tengan ninguna tabla.
  • Si se proporciona un parámetro de zona horaria en una instrucción, se anula la zona horaria predeterminada de la base de datos para esa instrucción.
  • Todas las marcas de tiempo de las APIs REST y RPC deben usar la zona horaria UTC y terminar con una Z en mayúsculas.
  • Las marcas de tiempo de los resultados de las consultas se muestran siempre en formato UTC, con Z al final. No se realizan conversiones de zonas horarias de visualización.

Roles obligatorios

Para obtener los permisos que necesitas para definir la zona horaria predeterminada de una base de datos, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de base de datos de Cloud Spanner (roles/spanner.databaseAdmin) en la base de datos. Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para definir la zona horaria predeterminada de una base de datos. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para definir la zona horaria predeterminada de una base de datos, se necesitan los siguientes permisos:

  • Definir la zona horaria predeterminada de una base de datos: spanner.databases.getDdl, spanner.databases.updateDdl

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Definir la zona horaria predeterminada

Para cambiar la zona horaria predeterminada de tu base de datos, ejecuta la siguiente instrucción:

GoogleSQL

Usa la instrucción ALTER DATABASE:

ALTER DATABASE DATABASE-NAME SET OPTIONS (default_time_zone = 'TIME-ZONE-NAME');

Haz los cambios siguientes:

  • DATABASE-NAME: el nombre de la base de datos. Por ejemplo, my-database.
  • TIME-ZONE-NAME: nombre de la zona horaria que se va a definir como predeterminada para la base de datos. Debe ser una entrada válida de la base de datos de zonas horarias de IANA. Por ejemplo, Etc/UTC.

PostgreSQL

Usa la instrucción ALTER DATABASE:

ALTER DATABASE DATABASE-NAME SET spanner.default_time_zone = 'TIME-ZONE-NAME';

Haz los cambios siguientes:

  • DATABASE-NAME: el nombre de la base de datos. Por ejemplo, my-database.
  • TIME-ZONE-NAME: nombre de la zona horaria que se va a definir como predeterminada para la base de datos. Debe ser una entrada válida de la base de datos de zonas horarias de IANA. Por ejemplo, Etc/UTC.

Ejemplos

Las siguientes consultas muestran cómo usar la opción de zona horaria predeterminada.

Zona horaria predeterminada no personalizada

Si la opción default_time_zone no se define explícitamente en el esquema de la base de datos, el valor de default_time_zone será nulo y Spanner usará America/Los_Angeles como zona horaria predeterminada. America/Los_Angeles tiene una diferencia de UTC-8 en las marcas de tiempo de los siguientes ejemplos.

Declaración:

SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;

Resultado:

/*----------------------*
 | timestamp_str        |
 +----------------------+
 | 2072-12-25T23:30:00Z |
 *----------------------*/

Declaración:

SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00")) AS hour;

Resultado:

/*------*
 | hour |
 +------+
 | 23   |
 *------*/

Declaración:

SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00", DAY) AS date_str;

Resultado:

/*----------------------*
 | date_str             |
 +----------------------+
 | 2072-12-25T08:00:00Z |
 *----------------------*/

La opción de zona horaria predeterminada se ha definido como Etc/UTC

En los siguientes ejemplos se muestra cómo se comportan las mismas instrucciones cuando la opción de zona horaria predeterminada es Etc/UTC.

Declaración:

SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;

Resultado:

/*----------------------*
 | timestamp_str        |
 +----------------------+
 | 2072-12-25T15:30:00Z |
 *----------------------*/

Declaración:

SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00")) AS hour;

Resultado:

/*------*
 | hour |
 +------+
 | 15   |
 *------*/

Declaración:

SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00+00", DAY) AS date_str;

Resultado:

/*----------------------*
 | date_str             |
 +----------------------+
 | 2072-12-25T00:00:00Z |
 *----------------------*/

La zona horaria predeterminada se ha sustituido por el parámetro de la función

Cuando una función o un literal de cadena incluye un parámetro de zona horaria definido, no se aplica la zona horaria predeterminada de la base de datos.

Declaración:

SELECT FORMAT_TIMESTAMP("%c", TIMESTAMP "2050-12-25 15:30:55+00", "Australia/Sydney")
  AS formatted;

Resultado:

/*--------------------------*
 | formatted                |
 +--------------------------+
 | Mon Dec 26 02:30:55 2050 |
 *--------------------------*/

Declaración:

SELECT TIMESTAMP("2072-12-25 15:30:00+11:00") AS timestamp_str;

Resultado:

/*----------------------*
 | timestamp_str        |
 +----------------------+
 | 2072-12-25T04:30:00Z |
 *----------------------*/