Definir o fuso horário padrão de um banco de dados

O Spanner fornece funções date e timestamp no GoogleSQL e no Cloud SQL para PostgreSQL. Algumas funções, como TIMESTAMP, dependem do fuso horário e aceitam um parâmetro opcional. Se nenhum parâmetro de fuso horário for fornecido em uma função, os bancos de dados do Spanner vão usar o fuso horário America/Los_Angeles por padrão.

O Spanner permite mudar o fuso horário padrão de um banco de dados para personalizar esse comportamento.

Limitações

  • Só é possível mudar o fuso horário de bancos de dados vazios sem tabelas.
  • Fornecer um parâmetro de fuso horário em uma instrução substitui o fuso horário padrão do banco de dados para essa instrução.
  • Todos os carimbos de data/hora nas APIs REST e RPC precisam usar UTC e terminar com um Z maiúsculo.
  • Os carimbos de data/hora nos resultados da consulta são apresentados de maneira consistente em UTC, com Z anexado. As conversões de fuso horário não são realizadas.

Funções exigidas

Para receber as permissões necessárias para definir o fuso horário padrão de um banco de dados, peça ao administrador para conceder a você o papel do IAM de Administrador do banco de dados do Cloud Spanner (roles/spanner.databaseAdmin) no banco de dados. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém as permissões necessárias para definir o fuso horário padrão de um banco de dados. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As seguintes permissões são necessárias para definir o fuso horário padrão de um banco de dados:

  • definir o fuso horário padrão de um banco de dados: spanner.databases.getDdl, spanner.databases.updateDdl

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Definir o fuso horário padrão

Para mudar o fuso horário padrão do banco de dados, execute a seguinte instrução:

GoogleSQL

Use a instrução ALTER DATABASE:

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

Substitua:

  • DATABASE-NAME: o nome do banco de dados. Por exemplo, my-database.
  • TIME-ZONE-NAME: o nome do fuso horário para definir o banco de dados como padrão. Precisa ser uma entrada válida do banco de dados de fuso horário da IANA. Por exemplo, Etc/UTC.

PostgreSQL

Use a instrução ALTER DATABASE:

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

Substitua:

  • DATABASE-NAME: o nome do banco de dados. Por exemplo, my-database.
  • TIME-ZONE-NAME: o nome do fuso horário para definir o banco de dados como padrão. Precisa ser uma entrada válida do banco de dados de fuso horário da IANA. Por exemplo, Etc/UTC.

Exemplos

Os exemplos de consultas a seguir mostram como usar a opção de fuso horário padrão.

Fuso horário padrão não personalizado

Se a opção default_time_zone não for definida explicitamente no esquema do banco de dados, o valor de default_time_zone será nulo e o Spanner usará America/Los_Angeles como o fuso horário padrão. America/Los_Angeles tem um deslocamento de UTC-8 para carimbos de data/hora nos exemplos a seguir.

Declaração:

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

Saída:

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

Declaração:

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

Saída:

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

Declaração:

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

Saída:

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

A opção de fuso horário padrão está definida como Etc/UTC

Os exemplos a seguir mostram como as mesmas instruções se comportam quando a opção de fuso horário padrão é definida como Etc/UTC.

Declaração:

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

Saída:

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

Declaração:

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

Saída:

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

Declaração:

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

Saída:

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

Fuso horário padrão substituído pelo parâmetro de função

Quando uma função ou um literal de string inclui um parâmetro de fuso horário definido, o fuso horário padrão do banco de dados não é aplicado.

Declaração:

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

Saída:

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

Declaração:

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

Saída:

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