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