הגדרת אזור הזמן שמוגדר כברירת מחדל במסד נתונים

‫Spanner מספק פונקציות של תאריך וחותמת זמן ב-GoogleSQL וב-Cloud SQL ל-PostgreSQL. חלק מהפונקציות, כמו TIMESTAMP, תלויות באזור זמן ומקבלות פרמטר אופציונלי של אזור זמן. אם לא מציינים פרמטר של אזור זמן בפונקציה, אזור הזמן שמוגדר כברירת מחדל במסדי נתונים של Spanner הוא America/Los_Angeles.

ב-Spanner אפשר לשנות את אזור הזמן שמוגדר כברירת מחדל במסד נתונים כדי להתאים אישית את ההתנהגות הזו.

מגבלות

  • אפשר לשנות את אזור הזמן רק במסדי נתונים ריקים בלי טבלאות.
  • אם מציינים פרמטר של אזור זמן בהצהרה, הוא מבטל את אזור הזמן שמוגדר כברירת מחדל במסד הנתונים עבור ההצהרה הזו.
  • כל חותמות הזמן ב-REST וב-RPC APIs חייבות להיות בפורמט UTC ולהסתיים באות Z גדולה.
  • חותמות הזמן בתוצאות השאילתה מוצגות באופן עקבי לפי שעון UTC, עם התוספת Z. לא מתבצעות המרות של אזורי זמן.

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות להגדרת אזור הזמן שמוגדר כברירת מחדל במסד נתונים, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד אדמין של מסד נתונים ב-Cloud Spanner (roles/spanner.databaseAdmin) במסד הנתונים. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות להגדרת אזור הזמן שמוגדר כברירת מחדל במסד נתונים. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי להגדיר את אזור הזמן שמוגדר כברירת מחדל במסד נתונים, צריך את ההרשאות הבאות:

  • הגדרת אזור הזמן שמוגדר כברירת מחדל במסד נתונים: 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 בחותמות הזמן בדוגמאות הבאות.

הצהרה:

GoogleSQL

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

PostgreSQL

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

פלט:

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

הצהרה:

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;

פלט:

/*------*
 | hour |
 +------+
 |  7   |
 *------*/

הצהרה:

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;

פלט:

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

אפשרות ברירת המחדל לאזור הזמן הוגדרה ל-Etc/UTC

בדוגמאות הבאות אפשר לראות איך אותן הצהרות מתנהגות כשהאפשרות של אזור הזמן שמוגדר כברירת מחדל מוגדרת ל-Etc/UTC.

הצהרה:

GoogleSQL

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

PostgreSQL

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

פלט:

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

הצהרה:

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;

פלט:

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

הצהרה:

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;

פלט:

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

פרמטר הפונקציה מבטל את אזור הזמן שמוגדר כברירת מחדל

כשפונקציה או מחרוזת מילולית כוללות פרמטר מוגדר של אזור זמן, אזור הזמן שמוגדר כברירת מחדל במסד הנתונים לא חל.

GoogleSQL

הצהרה:

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

PostgreSQL

הצהרה:

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

פלט:

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