المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ
افهم الفرق بين TIMESTAMP وTIMESTAMPTZ، وحوّل باستخدام AT TIME ZONE، وخزّن الوقت بتوقيت UTC لتطبيقات قابلة للنقل.
المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
نوعا الطابع الزمني
يحتوي PostgreSQL على نوعين من الطوابع الزمنية:
TIMESTAMP— طابع زمني «مجرد»، من دون معلومات عن المنطقة الزمنيةTIMESTAMPTZ— طابع زمني مع منطقة زمنية (يُخزّن داخليًا بتوقيت UTC)
قاعدة عامة: يُفضّل استخدام TIMESTAMPTZ للأحداث، وTIMESTAMP للأوقات المجردة تمامًا مثل «ساعات العمل تبدأ الساعة 9:00 صباحًا».
كيف يعمل TIMESTAMPTZ
يُخزّن دائمًا داخليًا بتوقيت UTC. عند INSERT، يُحوّل الإدخال من المنطقة الزمنية للجلسة إلى UTC. وعند SELECT، يُحوّل الإخراج مجددًا إلى المنطقة الزمنية للجلسة.
SET TIME ZONE 'Europe/Berlin';
INSERT INTO events (ts) VALUES ('2024-03-15 12:00:00');
-- stored as 2024-03-15 11:00:00 UTC (Berlin is UTC+1 in winter)
SET TIME ZONE 'UTC';
SELECT ts FROM events;
-- 2024-03-15 11:00:00+00TIMESTAMP يفقد معلومات المنطقة الزمنية
لا يعرف TIMESTAMP العادي المنطقة الزمنية. فقد تعني القيمة «2024-03-15 12:00:00» أي وقت محلي. وعندما ينتقل المستخدمون بين المناطق الزمنية، يضيع معناها.
AT TIME ZONE
حوّل بين المناطق الزمنية لأغراض العرض:
SELECT ts AT TIME ZONE 'America/New_York' AS ny_time FROM events;
SELECT ts AT TIME ZONE 'Asia/Tokyo' AS tokyo_time FROM events;تخزين UTC وعرض التوقيت المحلي
أفضل ممارسة: خزّن TIMESTAMPTZ، وحوّله إلى منطقة المستخدم الزمنية في SELECT، ولا تفعل العكس مطلقًا.
SELECT id,
ts AT TIME ZONE COALESCE(u.tz, 'UTC') AS local_ts
FROM events e
JOIN users u ON u.id = e.user_id;المنطقة الزمنية للجلسة
يمكنك تعيينها لكل جلسة أو مستخدم أو على مستوى عام:
-- Session:
SET TIME ZONE 'Europe/Berlin';
-- Per-user (PG):
ALTER ROLE alice SET timezone TO 'Europe/Berlin';
-- Server default in postgresql.conf:
-- timezone = 'UTC'تحديد المنطقة الزمنية في القيمة الحرفية
ضمّن المنطقة الزمنية في القيمة الحرفية:
SELECT TIMESTAMPTZ '2024-03-15 12:00:00 Europe/Berlin';
SELECT '2024-03-15 12:00:00+02'::TIMESTAMPTZ;تعيد NOW() قيمة TIMESTAMPTZ
تعيد كل من NOW() وCURRENT_TIMESTAMP دائمًا قيمة TIMESTAMPTZ. وخلطهما مع أعمدة TIMESTAMP خطأ شائع.
متى يكون TIMESTAMP (من دون منطقة زمنية) مناسبًا
بالنسبة إلى الأوقات المجردة أو المحلية التي لا تعتمد فعليًا على منطقة زمنية — مثل «يفتح المتجر الساعة 09:00» — استخدم TIMESTAMP (أو TIME).
CREATE TABLE store_hours (
store_id BIGINT,
open_at TIME NOT NULL,
close_at TIME NOT NULL
);انتقالات التوقيت الصيفي
يتعامل TIMESTAMPTZ مع التوقيت الصيفي تلقائيًا. وتعمل إضافة INTERVAL وفق ساعات الساعة المحلية، إلا إذا عبرتَ حدًا للتوقيت الصيفي — عندها قد تتحرك بمقدار 23 أو 25 ساعة.
SELECT TIMESTAMPTZ '2024-03-30 23:00:00 Europe/Berlin' + INTERVAL '5 hours';
-- Result accounts for the DST transition on March 31لا تخزّن الإزاحات، بل خزّن أسماء المناطق الزمنية
لا تخبرك إزاحة مثل +02:00 بموعد بدء التوقيت الصيفي، بينما يخبرك اسم منطقة مثل Europe/Berlin بذلك. وعند تخزين المنطقة الزمنية الرئيسية للمستخدم، خزّن اسم IANA.
مراجعة
اجعل TIMESTAMPTZ الخيار الافتراضي للأحداث.
- يُخزّن بتوقيت UTC ويُعرض وفق المنطقة الزمنية للجلسة
- حوّله لأغراض العرض باستخدام AT TIME ZONE
- استخدم TIMESTAMP (من دون منطقة زمنية) للأوقات المحلية المجردة فقط
تحقق سريع
أنت تنشئ SaaS عالميًا يسجل أحداث المستخدمين. ما نوع الطابع الزمني الذي ينبغي استخدامه للعمود occurred_at؟
الأسئلة الشائعة
هل درس «المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ» مجاني؟
نعم — نص درس «المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ»؟
افهم الفرق بين TIMESTAMP وTIMESTAMPTZ، وحوّل باستخدام AT TIME ZONE، وخزّن الوقت بتوقيت UTC لتطبيقات قابلة للنقل. تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الحساب على التواريخ وINTERVAL
- EXTRACT وDATE_TRUNC وAGE
- المناطق الزمنية: TIMESTAMP مقابل TIMESTAMPTZ
- تقارير التواريخ الشائعة (MTD وWoW وYoY)