Impostare il fuso orario predefinito di un database

Spanner fornisce funzioni date e timestamp in GoogleSQL e Cloud SQL per PostgreSQL. Alcune funzioni, come TIMESTAMP, dipendono dal fuso orario e accettano un parametro facoltativo per il fuso orario. Se in una funzione non viene fornito alcun parametro del fuso orario, i database Spanner utilizzano per impostazione predefinita 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.
  • Se fornisci un parametro del fuso orario all'interno di un'istruzione, il fuso orario predefinito del database viene sostituito per quell'istruzione.
  • Tutti i timestamp nelle API REST e RPC devono utilizzare il fuso orario UTC e terminare con la lettera maiuscola Z.
  • I timestamp nei risultati della query vengono presentati in modo coerente in formato UTC, con l'aggiunta di Z. Le conversioni del fuso orario di 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 Cloud Spanner Database Admin (roles/spanner.databaseAdmin) sul database. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per impostare il fuso orario predefinito di un database. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

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 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 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 in modo esplicito nello schema del database, il valore di default_time_zone è null e Spanner utilizza America/Los_Angeles come fuso orario predefinito. America/Los_Angeles ha uno scarto di UTC-8 per i timestamp negli esempi seguenti.

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 |
 *----------------------*/

Opzione del fuso orario predefinito impostata su Etc/UTC

I seguenti esempi 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 sottoposto a override dal parametro della funzione

Quando una funzione o un valore letterale stringa include un parametro del 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 |
 *----------------------*/