Spanner fornisce
funzioni di data
e
timestamp
in GoogleSQL
e Cloud SQL per PostgreSQL. Alcune funzioni, come
TIMESTAMP,
dipendono dal fuso orario e accettano un parametro del fuso orario facoltativo. 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 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 in un'istruzione, questo esegue l'override del fuso orario predefinito del database per l'istruzione.
- Tutti i timestamp nelle
API REST ed RPC
devono utilizzare UTC e terminare con una
Zmaiuscola. - I timestamp nei risultati delle query vengono presentati in modo coerente in formato UTC, con l'aggiunta di
Z. Non vengono eseguite conversioni del fuso orario di visualizzazione.
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) 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'
ALTER DATABASE istruzione:
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'
ALTER DATABASE istruzione:
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 un offset di UTC-8 per i timestamp negli esempi seguenti.
Statement:
GoogleSQL
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
PostgreSQL
SELECT '2072-12-25 15:30:00'::timestamptz AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T23:30:00Z |
*----------------------*/
Statement:
GoogleSQL
SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00Z")) AS hour;
PostgreSQL
SELECT EXTRACT(HOUR FROM '2072-12-25 15:30:00Z'::timestamptz) AS hour;
Output:
/*------*
| hour |
+------+
| 7 |
*------*/
Statement:
GoogleSQL
SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00Z", DAY) AS date_str;
PostgreSQL
SELECT DATE_TRUNC('day', TIMESTAMPTZ '2072-12-25 15:30:00Z') AS date_str;
Output:
/*----------------------*
| date_str |
+----------------------+
| 2072-12-25T08:00:00Z |
*----------------------*/
Opzione del fuso orario predefinito impostata su Etc/UTC
Gli esempi seguenti mostrano il comportamento delle stesse istruzioni quando l'opzione del fuso orario predefinito è impostata su Etc/UTC.
Statement:
GoogleSQL
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
PostgreSQL
SELECT '2072-12-25 15:30:00'::timestamptz AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T15:30:00Z |
*----------------------*/
Statement:
GoogleSQL
SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00Z")) AS hour;
PostgreSQL
SELECT EXTRACT(HOUR FROM '2072-12-25 15:30:00Z'::timestamptz) AS hour;
Output:
/*------*
| hour |
+------+
| 15 |
*------*/
Statement:
GoogleSQL
SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00Z", DAY) AS date_str;
PostgreSQL
SELECT DATE_TRUNC('day', TIMESTAMPTZ '2072-12-25 15:30:00Z') AS date_str;
Output:
/*----------------------*
| date_str |
+----------------------+
| 2072-12-25T00:00:00Z |
*----------------------*/
Il 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.
GoogleSQL
Statement:
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 |
*--------------------------*/
Statement:
SELECT TIMESTAMP("2072-12-25 15:30:00+11:00") AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T04:30:00Z |
*----------------------*/
PostgreSQL
Statement:
SELECT '2072-12-25 15:30:00+11:00'::timestamptz AS timestamp_str;
Output:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T04:30:00Z |
*----------------------*/