Spanner bietet date- und timestamp-Funktionen in GoogleSQL und Cloud SQL for PostgreSQL. Einige Funktionen, z. B. 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 einen Zeitzonenparameter in einer Anweisung 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 einheitlich in UTC mit dem Zusatz
Z
dargestellt. Zeitzonenumwandlungen 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 zuzuweisen.
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 die folgende Anweisung 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 von „default_time_zone“ „null“ und Spanner verwendet America/Los_Angeles
als Standardzeitzone. America/Los_Angeles
hat in den folgenden Beispielen einen Offset von UTC-8 für Zeitstempel.
Mitteilung:
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T23:30:00Z |
*----------------------*/
Mitteilung:
SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00")) AS hour;
Ausgabe:
/*------*
| hour |
+------+
| 23 |
*------*/
Mitteilung:
SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00", DAY) AS date_str;
Ausgabe:
/*----------------------*
| date_str |
+----------------------+
| 2072-12-25T08:00:00Z |
*----------------------*/
Option für Standardzeitzone auf Etc/UTC
festgelegt
Die folgenden Beispiele zeigen, wie sich dieselben Anweisungen verhalten, wenn die Standardzeitzonenoption auf Etc/UTC
festgelegt ist.
Mitteilung:
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T15:30:00Z |
*----------------------*/
Mitteilung:
SELECT EXTRACT(HOUR FROM TIMESTAMP("2072-12-25 15:30:00")) AS hour;
Ausgabe:
/*------*
| hour |
+------+
| 15 |
*------*/
Mitteilung:
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.
Mitteilung:
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 |
*--------------------------*/
Mitteilung:
SELECT TIMESTAMP("2072-12-25 15:30:00+11:00") AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T04:30:00Z |
*----------------------*/