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