Spanner fornisce le funzioni data e timestamp in GoogleSQL e Cloud SQL per PostgreSQL. Alcune funzioni, come
TIMESTAMP
,
dipendono dal fuso orario e accettano un parametro facoltativo del fuso orario. Se in una funzione non viene fornito alcun parametro fuso orario, per impostazione predefinita i database Spanner utilizzano il fuso orario America/Los_Angeles
.
Spanner ti consente di modificare il fuso orario predefinito di un database per personalizzare questo comportamento.
Limitazioni
- Puoi modificare il fuso orario solo dei database vuoti senza tabelle.
- L'indicazione di un parametro di fuso orario all'interno di un'istruzione sostituisce il fuso orario predefinito del database per l'istruzione.
- Tutti i timestamp nelle
API REST e RPC
devono utilizzare UTC e terminare con una
Z
maiuscola. - I timestamp nei risultati della query vengono sempre presentati in UTC, con
Z
aggiunto. Le conversioni dei fusi orari per la visualizzazione non vengono eseguite.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per impostare il fuso orario predefinito di un database, chiedi all'amministratore di concederti il ruolo IAM Amministratore database Cloud Spanner (roles/spanner.databaseAdmin
) nel database.
Per ulteriori informazioni sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Questo ruolo predefinito contiene le autorizzazioni necessarie per impostare il fuso orario predefinito di un database. Per visualizzare le autorizzazioni esatte richieste, espandi la sezione Autorizzazioni richieste:
Autorizzazioni obbligatorie
Per impostare il fuso orario predefinito di un database sono necessarie le seguenti autorizzazioni:
-
imposta il fuso orario predefinito di un database:
spanner.databases.getDdl, spanner.databases.updateDdl
Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.
Impostare il fuso orario predefinito
Per modificare il fuso orario predefinito del database, esegui la seguente istruzione:
GoogleSQL
Utilizza
l'istruzione ALTER DATABASE
:
ALTER DATABASE DATABASE-NAME SET OPTIONS (default_time_zone = 'TIME-ZONE-NAME');
Sostituisci quanto segue:
- DATABASE-NAME: il nome del database. Ad esempio,
my-database
. - TIME-ZONE-NAME: il nome del fuso orario da impostare come valore predefinito per il database. Deve essere una voce valida del
database dei fusi orari IANA. Ad esempio,
Etc/UTC
.
PostgreSQL
Utilizza
l'istruzione ALTER DATABASE
:
ALTER DATABASE DATABASE-NAME SET spanner.default_time_zone = 'TIME-ZONE-NAME';
Sostituisci quanto segue:
- DATABASE-NAME: il nome del database. Ad esempio,
my-database
. - TIME-ZONE-NAME: il nome del fuso orario da impostare come valore predefinito per il database. Deve essere una voce valida del
database dei fusi orari IANA. Ad esempio,
Etc/UTC
.
Esempi
Le seguenti query di esempio mostrano come utilizzare l'opzione del fuso orario predefinito.
Fuso orario predefinito non personalizzato
Se l'opzione default_time_zone non è impostata esplicitamente nello schema del database, il valore di default_time_zone è nullo e Spanner utilizza America/Los_Angeles
come fuso orario predefinito. America/Los_Angeles
ha un offset di UTC-8 per i timestamp nei seguenti esempi.
Dichiarazione:
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T23:30:00Z |
*----------------------*/
Dichiarazione:
SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00")) AS hour;
Output:
/*------*
| hour |
+------+
| 23 |
*------*/
Dichiarazione:
SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00", DAY) AS date_str;
Output:
/*----------------------*
| date_str |
+----------------------+
| 2072-12-25T08:00:00Z |
*----------------------*/
L'opzione del fuso orario predefinito è impostata su Etc/UTC
Gli esempi riportati di seguito mostrano il comportamento delle stesse istruzioni quando l'opzione del fuso orario predefinito è impostata su Etc/UTC
.
Dichiarazione:
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T15:30:00Z |
*----------------------*/
Dichiarazione:
SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00")) AS hour;
Output:
/*------*
| hour |
+------+
| 15 |
*------*/
Dichiarazione:
SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00+00", DAY) AS date_str;
Output:
/*----------------------*
| date_str |
+----------------------+
| 2072-12-25T00:00:00Z |
*----------------------*/
Fuso orario predefinito sostituito dal parametro della funzione
Quando una funzione o una stringa letterale include un parametro di fuso orario definito, il fuso orario predefinito del database non viene applicato.
Dichiarazione:
SELECT FORMAT_TIMESTAMP("%c", TIMESTAMP "2050-12-25 15:30:55+00", "Australia/Sydney")
AS formatted;
Output:
/*--------------------------*
| formatted |
+--------------------------+
| Mon Dec 26 02:30:55 2050 |
*--------------------------*/
Dichiarazione:
SELECT TIMESTAMP("2072-12-25 15:30:00+11:00") AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T04:30:00Z |
*----------------------*/