Menetapkan zona waktu default database

Spanner menyediakan fungsi tanggal dan stempel waktu di GoogleSQL dan Cloud SQL untuk PostgreSQL. Beberapa fungsi, seperti TIMESTAMP, bergantung pada zona waktu dan menerima parameter zona waktu opsional. Jika tidak ada parameter zona waktu yang disediakan dalam suatu fungsi, database Spanner akan menggunakan zona waktu America/Los_Angeles secara default.

Spanner memungkinkan Anda mengubah zona waktu default database untuk menyesuaikan perilaku ini.

Batasan

  • Anda hanya dapat mengubah zona waktu database kosong tanpa tabel apa pun.
  • Menyediakan parameter zona waktu dalam pernyataan akan mengganti zona waktu default database untuk pernyataan tersebut.
  • Semua stempel waktu di REST dan RPC API harus menggunakan UTC dan diakhiri dengan Z huruf besar.
  • Stempel waktu dalam hasil kueri selalu ditampilkan dalam UTC, dengan Z ditambahkan. Konversi zona waktu tampilan tidak dilakukan.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk menetapkan zona waktu default database, minta administrator Anda untuk memberi Anda peran IAM Cloud Spanner Database Admin (roles/spanner.databaseAdmin) di database. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Peran bawaan ini berisi izin yang diperlukan untuk menetapkan zona waktu default database. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk menetapkan zona waktu default database:

  • menetapkan zona waktu default database: spanner.databases.getDdl, spanner.databases.updateDdl

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Menetapkan zona waktu default

Untuk mengubah zona waktu default database, jalankan pernyataan berikut:

GoogleSQL

Gunakan pernyataan ALTER DATABASE:

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

Ganti kode berikut:

  • DATABASE-NAME: nama database. Contoh, my-database.
  • TIME-ZONE-NAME: nama zona waktu untuk menetapkan default database. Harus berupa entri yang valid dari Database Zona Waktu IANA. Contoh, Etc/UTC.

PostgreSQL

Gunakan pernyataan ALTER DATABASE:

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

Ganti kode berikut:

  • DATABASE-NAME: nama database. Contoh, my-database.
  • TIME-ZONE-NAME: nama zona waktu untuk menetapkan default database. Harus berupa entri yang valid dari Database Zona Waktu IANA. Contoh, Etc/UTC.

Contoh

Contoh kueri berikut menunjukkan cara menggunakan opsi zona waktu default.

Zona waktu default tidak disesuaikan

Jika opsi default_time_zone tidak ditetapkan secara eksplisit dalam skema database, nilai default_time_zone akan null dan Spanner menggunakan America/Los_Angeles sebagai zona waktu default. America/Los_Angeles memiliki offset UTC-8 untuk stempel waktu dalam contoh berikut.

Pernyataan:

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

Pernyataan:

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

Pernyataan:

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

Opsi zona waktu default ditetapkan ke Etc/UTC

Contoh berikut menunjukkan perilaku pernyataan yang sama saat opsi zona waktu default ditetapkan ke Etc/UTC.

Pernyataan:

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

Pernyataan:

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

Pernyataan:

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

Zona waktu default diganti oleh parameter fungsi

Jika fungsi atau literal string menyertakan parameter zona waktu yang ditentukan, zona waktu default database tidak akan diterapkan.

GoogleSQL

Pernyataan:

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

Pernyataan:

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

Output:

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

PostgreSQL

Pernyataan:

SELECT '2072-12-25 15:30:00+11:00'::timestamptz AS timestamp_str;

Output:

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