Spanner bietet
Datums
und
Zeitstempel
funktionen in GoogleSQL
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, verwenden Spanner-Datenbanken standardmäßig die Zeitzone America/Los_Angeles.
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
Zenden. - Zeitstempel in Abfrageergebnissen werden immer in UTC mit angehängtem
Zdargestellt. Es werden keine Zeitzonenkonvertierungen für die Anzeige durchgeführt.
Erforderliche Rollen
Um die Berechtigungen zu erhalten, die
zum Festlegen der Standardzeitzone einer Datenbank erforderlich sind,
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. Maximieren Sie den Abschnitt Erforderliche Berechtigungen , um die notwendigen Berechtigungen anzuzeigen, die erforderlich sind:
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
ALTER DATABASE Anweisung:
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
ALTER DATABASE Anweisung:
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 Abfragebeispiele zeigen, wie Sie die Option für die Standardzeitzone verwenden.
Standardzeitzone nicht angepasst
Wenn die Option `default_time_zone` im Datenbankschema nicht explizit 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.
Anweisung:
GoogleSQL
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
PostgreSQL
SELECT '2072-12-25 15:30:00'::timestamptz AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T23:30:00Z |
*----------------------*/
Anweisung:
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;
Ausgabe:
/*------*
| hour |
+------+
| 7 |
*------*/
Anweisung:
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;
Ausgabe:
/*----------------------*
| date_str |
+----------------------+
| 2072-12-25T08:00:00Z |
*----------------------*/
Option für die Standardzeitzone auf Etc/UTC festgelegt
Die folgenden Beispiele zeigen, wie sich dieselben Anweisungen verhalten, wenn die Option für die Standardzeitzone auf Etc/UTC festgelegt ist.
Anweisung:
GoogleSQL
SELECT TIMESTAMP("2072-12-25 15:30:00") AS timestamp_str;
PostgreSQL
SELECT '2072-12-25 15:30:00'::timestamptz AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T15:30:00Z |
*----------------------*/
Anweisung:
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;
Ausgabe:
/*------*
| hour |
+------+
| 15 |
*------*/
Anweisung:
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;
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.
GoogleSQL
Anweisung:
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 |
*--------------------------*/
Anweisung:
SELECT TIMESTAMP("2072-12-25 15:30:00+11:00") AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T04:30:00Z |
*----------------------*/
PostgreSQL
Anweisung:
SELECT '2072-12-25 15:30:00+11:00'::timestamptz AS timestamp_str;
Ausgabe:
/*----------------------*
| timestamp_str |
+----------------------+
| 2072-12-25T04:30:00Z |
*----------------------*/