O Spanner fornece funções de data e data/hora no GoogleSQL e no Cloud SQL para PostgreSQL. Algumas funções, como
TIMESTAMP,
dependem do fuso horário e aceitam um parâmetro de fuso horário opcional. Se não for fornecido nenhum parâmetro de fuso horário numa função, as bases de dados do Spanner usam como predefinição o fuso horário America/Los_Angeles.
O Spanner permite-lhe alterar o fuso horário predefinido de uma base de dados para personalizar este comportamento.
Limitações
- Só pode alterar o fuso horário de bases de dados vazias sem tabelas.
- A indicação de um parâmetro de fuso horário numa declaração substitui o fuso horário predefinido da base de dados para essa declaração.
- Todas as indicações de tempo nas
APIs REST e RPC
têm de usar o fuso horário UTC e terminar com um
Zem maiúsculas. - As datas/horas nos resultados da consulta são apresentadas de forma consistente em UTC, com
Zanexado. Não são feitas conversões do fuso horário de apresentação.
Funções necessárias
Para receber as autorizações de que precisa para definir o fuso horário predefinido de uma base de dados, peça ao seu administrador para lhe conceder a função de IAM Administrador da base de dados do Cloud Spanner (roles/spanner.databaseAdmin) na base de dados.
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Esta função predefinida contém as autorizações necessárias para definir o fuso horário predefinido de uma base de dados. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:
Autorizações necessárias
São necessárias as seguintes autorizações para definir o fuso horário predefinido de uma base de dados:
-
defina o fuso horário predefinido de uma base de dados:
spanner.databases.getDdl, spanner.databases.updateDdl
Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.
Defina o fuso horário predefinido
Para alterar o fuso horário predefinido da sua base de dados, execute a seguinte declaração:
GoogleSQL
Use a declaração
ALTER DATABASE:
ALTER DATABASE DATABASE-NAME SET OPTIONS (default_time_zone = 'TIME-ZONE-NAME');
Substitua o seguinte:
- DATABASE-NAME: o nome da base de dados. Por exemplo,
my-database. - TIME-ZONE-NAME: o nome do fuso horário para o qual a base de dados deve ser definida por predefinição. Tem de ser uma entrada válida da
base de dados de fusos horários da IANA. Por exemplo,
Etc/UTC.
PostgreSQL
Use a declaração
ALTER DATABASE:
ALTER DATABASE DATABASE-NAME SET spanner.default_time_zone = 'TIME-ZONE-NAME';
Substitua o seguinte:
- DATABASE-NAME: o nome da base de dados. Por exemplo,
my-database. - TIME-ZONE-NAME: o nome do fuso horário para o qual a base de dados deve ser definida por predefinição. Tem de ser uma entrada válida da
base de dados de fusos horários da IANA. Por exemplo,
Etc/UTC.
Exemplos
As consultas de exemplo seguintes mostram como usar a opção de fuso horário predefinido.
O fuso horário predefinido não está personalizado
Se a opção default_time_zone não estiver definida explicitamente no esquema da base de dados,
o valor de default_time_zone é nulo e o Spanner
usa America/Los_Angeles como o fuso horário predefinido. America/Los_Angeles tem
uma diferença de UTC-8 para as datas/horas nos exemplos seguintes.
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 |
*----------------------*/
Opção de fuso horário predefinido definida como Etc/UTC
Os exemplos seguintes mostram o comportamento das mesmas declarações quando a opção de fuso horário predefinido está 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 |
*----------------------*/
O fuso horário predefinido é substituído pelo parâmetro da função
Quando uma função ou um literal de string inclui um parâmetro de fuso horário definido, o fuso horário predefinido da base 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 |
*----------------------*/