데이터베이스 기본 시간대 설정

Spanner는 GoogleSQL 및 PostgreSQL용 Cloud SQL에 날짜타임스탬프 함수를 제공합니다. TIMESTAMP와 같은 일부 함수는 시간대에 종속되며 선택적 시간대 파라미터를 허용합니다. 함수에 시간대 파라미터가 제공되지 않으면 Spanner 데이터베이스 기본값은 America/Los_Angeles 시간대입니다.

Spanner를 사용하면 데이터베이스의 기본 시간대를 변경하여 이 동작을 맞춤설정할 수 있습니다.

제한사항

  • 테이블이 없는 비어 있는 데이터베이스의 시간대만 변경할 수 있습니다.
  • 문에 시간대 파라미터를 제공하면 해당 문에 사용되는 데이터베이스의 기본 시간대가 재정의됩니다.
  • REST 및 RPC API의 모든 타임스탬프는 UTC를 사용하고 대문자 Z로 끝나야 합니다.
  • 쿼리 결과의 타임스탬프는 Z가 추가된 UTC로 일관되게 표시됩니다. 표시 시간대 변환은 수행되지 않습니다.

필요한 역할

데이터베이스의 기본 시간대를 설정하는 데 필요한 권한을 얻으려면 관리자에게 데이터베이스에 대한 Cloud Spanner 데이터베이스 관리자 (roles/spanner.databaseAdmin) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 데이터베이스의 기본 시간대를 설정하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

데이터베이스의 기본 시간대를 설정하려면 다음 권한이 필요합니다.

  • 데이터베이스의 기본 시간대 설정: spanner.databases.getDdl, spanner.databases.updateDdl

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

기본 시간대 설정

데이터베이스의 기본 시간대를 변경하려면 다음 문을 실행합니다.

GoogleSQL

ALTER DATABASE을 사용합니다.

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

다음을 바꿉니다.

  • DATABASE-NAME: 데이터베이스의 이름 예를 들면 my-database입니다.
  • TIME-ZONE-NAME: 데이터베이스 기본값을 설정할 시간대의 이름입니다. IANA 시간대 데이터베이스의 유효한 항목이어야 합니다. 예를 들면 Etc/UTC입니다.

PostgreSQL

ALTER DATABASE을 사용합니다.

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

다음을 바꿉니다.

  • DATABASE-NAME: 데이터베이스의 이름 예를 들면 my-database입니다.
  • TIME-ZONE-NAME: 데이터베이스 기본값을 설정할 시간대의 이름입니다. IANA 시간대 데이터베이스의 유효한 항목이어야 합니다. 예를 들면 Etc/UTC입니다.

예시

다음 쿼리 예시에서는 기본 시간대 옵션을 사용하는 방법을 보여줍니다.

기본 시간대가 맞춤설정되지 않음

default_time_zone 옵션이 데이터베이스 스키마에 명시적으로 설정되지 않으면 default_time_zone 값은 null이고 Spanner는 America/Los_Angeles를 기본 시간대로 사용합니다. 다음 예시에서 America/Los_Angeles의 타임스탬프 오프셋은 UTC-8입니다.

문:

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

출력:

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

문:

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

출력:

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

문:

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

출력:

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

Etc/UTC로 설정된 기본 시간대 옵션

다음 예시에서는 기본 시간대 옵션이 Etc/UTC로 설정된 경우에 같은 문이 작동하는 방식을 보여줍니다.

문:

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

출력:

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

문:

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

출력:

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

문:

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

출력:

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

함수 파라미터로 재정의된 기본 시간대

함수 또는 문자열 리터럴에 정의된 시간대 파라미터가 포함된 경우에는 데이터베이스의 기본 시간대가 적용되지 않습니다.

문:

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

출력:

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

문:

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

출력:

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