Menetapkan zona waktu default database

Spanner menyediakan fungsi date dan timestamp 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 diberikan dalam fungsi, database Spanner secara default menggunakan zona waktu America/Los_Angeles.

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 menggantikan zona waktu default database untuk pernyataan tersebut.
  • Semua stempel waktu di REST API dan RPC API harus menggunakan UTC dan diakhiri dengan Z huruf besar.
  • Stempel waktu dalam hasil kueri ditampilkan secara konsisten dalam UTC, dengan Z ditambahkan. Konversi zona waktu tampilan tidak dilakukan.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna menetapkan zona waktu default database, minta administrator 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 menyetel zona waktu default database. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Izin berikut diperlukan untuk menyetel 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 Anda, 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 yang akan ditetapkan sebagai default database. Harus berupa entri yang valid dari Database Zona Waktu IANA. Contohnya, 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 yang akan ditetapkan sebagai default database. Harus berupa entri yang valid dari Database Zona Waktu IANA. Contohnya, 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 adalah null dan Spanner menggunakan America/Los_Angeles sebagai zona waktu default. America/Los_Angeles memiliki selisih waktu UTC-8 untuk stempel waktu dalam contoh berikut.

Pernyataan:

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

Output:

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

Pernyataan:

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

Output:

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

Pernyataan:

SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00", DAY) 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 disetel ke Etc/UTC.

Pernyataan:

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

Output:

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

Pernyataan:

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

Output:

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

Pernyataan:

SELECT TIMESTAMP_TRUNC(TIMESTAMP "2072-12-25 15:30:00+00", DAY) 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.

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