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

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

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

מגבלות

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

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

כדי לקבל את ההרשאות שנדרשות להגדרת אזור הזמן שמוגדר כברירת מחדל במסד נתונים, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM‏ Cloud Spanner Database Admin (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 |
*----------------------*/