Standardzeitzone einer Datenbank festlegen

Spanner bietet die Funktionen Datum und Zeitstempel in Google SQL und Cloud SQL for PostgreSQL. Einige Funktionen wie TIMESTAMP sind zeitzonenabhängig und akzeptieren einen optionalen Zeitzonenparameter. Wenn in einer Funktion kein Zeitzonenparameter angegeben ist, wird in Spanner-Datenbanken standardmäßig die Zeitzone America/Los_Angeles verwendet.

In Spanner können Sie die Standardzeitzone einer Datenbank ändern, um dieses Verhalten anzupassen.

Beschränkungen

  • Sie können die Zeitzone nur für leere Datenbanken ohne Tabellen ändern.
  • Wenn Sie in einer Anweisung einen Zeitzonenparameter angeben, wird die Standardzeitzone der Datenbank für diese Anweisung überschrieben.
  • Alle Zeitstempel in den REST- und RPC-APIs müssen UTC verwenden und mit einem großen Z enden.
  • Zeitstempel in Abfrageergebnissen werden immer in UTC mit angehängtem Z angezeigt. Zeitzonenumwandlungen für die Anzeige werden nicht durchgeführt.

Erforderliche Rollen

Um die Berechtigungen zu erhalten, die Sie zum Festlegen der Standardzeitzone einer Datenbank benötigen, bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Cloud Spanner Database Admin (roles/spanner.databaseAdmin) für die Datenbank zu gewähren. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Festlegen der Standardzeitzone einer Datenbank erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Die folgenden Berechtigungen sind erforderlich, um die Standardzeitzone einer Datenbank festzulegen:

  • Standardzeitzone einer Datenbank festlegen: spanner.databases.getDdl, spanner.databases.updateDdl

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Standardzeitzone festlegen

Führen Sie den folgenden Befehl aus, um die Standardzeitzone Ihrer Datenbank zu ändern:

GoogleSQL

Verwenden Sie die AnweisungALTER DATABASE:

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

Ersetzen Sie Folgendes:

  • DATABASE-NAME: der Name der Datenbank Beispiel: my-database
  • TIME-ZONE-NAME: der Name der Zeitzone, die als Standard für die Datenbank festgelegt werden soll. Muss ein gültiger Eintrag aus der IANA-Zeitzonendatenbank sein. Beispiel: Etc/UTC.

PostgreSQL

Verwenden Sie die AnweisungALTER DATABASE:

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

Ersetzen Sie Folgendes:

  • DATABASE-NAME: der Name der Datenbank Beispiel: my-database
  • TIME-ZONE-NAME: der Name der Zeitzone, die als Standard für die Datenbank festgelegt werden soll. Muss ein gültiger Eintrag aus der IANA-Zeitzonendatenbank sein. Beispiel: Etc/UTC.

Beispiele

Die folgenden Beispielabfragen zeigen, wie die Standardzeitzonenoption verwendet wird.

Standardzeitzone nicht angepasst

Wenn die Option „default_time_zone“ nicht explizit im Datenbankschema festgelegt ist, ist der Wert „default_time_zone“ null und Spanner verwendet America/Los_Angeles als Standardzeitzone. America/Los_Angeles hat einen Zeitversatz von UTC-8 für Zeitstempel in den folgenden Beispielen.

Erklärung:

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

Ausgabe:

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

Erklärung:

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

Ausgabe:

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

Erklärung:

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

Ausgabe:

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

Standardzeitzone auf Etc/UTC festgelegt

Die folgenden Beispiele zeigen, wie sich dieselben Anweisungen verhalten, wenn die Standardzeitzone auf Etc/UTC festgelegt ist.

Erklärung:

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

Ausgabe:

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

Erklärung:

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

Ausgabe:

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

Erklärung:

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

Ausgabe:

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

Standardzeitzone durch Funktionsparameter überschrieben

Wenn eine Funktion oder ein Stringliteral einen definierten Zeitzonenparameter enthält, wird die Standardzeitzone der Datenbank nicht angewendet.

Erklärung:

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

Ausgabe:

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

Erklärung:

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

Ausgabe:

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