الانتقال إلى المحتوى الرئيسي
الوحدة 6 · الدرس 2 من 422/57 في الدورة~12 min
دروس الوحدة (2/4)

وظائف التاريخ والطابع الزمني

التواريخ والطوابع الزمنية موجودة في كل مكان: الطلبات، وتسجيلات الدخول، والأحداث، والفواتير. في سنتعرف في هذا الدرس على كيفية استخراج الأجزاء من تاريخ (سنة، شهر...)، اقتطاع البيانات إلى تفاصيل (شهر، أسبوع...)، وحساب الفترات والاختلافات، وإجراء المقارنات عبر الفترات.

الأنواع الأساسية

يميز PostgreSQL:

  • DATE — التاريخ فقط، التنسيق YYYY-MM-DD؛
  • TIMESTAMP — التاريخ + الوقت، بدون منطقة زمنية؛
  • TIMESTAMPTZ — التاريخ + الوقت + المنطقة الزمنية؛
  • INTERVAL — فترة (على سبيل المثال '3 days'، '2 hours 30 minutes').

في مجموعة البيانات ecommerce الخاصة بنا:

العموداكتب
محمي_INLINE_8محمي_INLINE_9
محمي_INLINE_10محمي_INLINE_11
محمي_INLINE_12محمي_INLINE_13 (يمكن أن يكون محمي_INLINE_14)

استخراج - قراءة جزء

EXTRACT(part FROM date) يستخرج رقمًا:

SQL
SELECT EXTRACT(YEAR  FROM ordered_at) AS year,
       EXTRACT(MONTH FROM ordered_at) AS month,
       EXTRACT(DOW   FROM ordered_at) AS day_of_week  -- 0=domenica
FROM   orders;

الأجزاء الأكثر استخدامًا: YEAR، MONTH، DAY، HOUR، MINUTE، DOW (يوم من الأسبوع 0-6)، محمي_INLINE_22 (يوم من السنة).

DATE_TRUNC — التقريب للأسفل

DATE_TRUNC('part', date) "يقتطع" التاريخ بدقة. إنه كذلك ضروري للتجميع حسب الشهر والأسبوع والساعة:

SQL
-- Tutti gli ordini fatti in "marzo 2025" cadono nello stesso bucket:
SELECT DATE_TRUNC('month', ordered_at) AS month,
       COUNT(*) AS order_count
FROM   orders
GROUP BY month
ORDER BY month;

الأجزاء الصالحة: 'year'، 'quarter'، 'month'، 'week'، 'day'، 'hour'، 'minute'، 'second'.

لتسهيل القراءة، غالبًا ما يرسل الأشخاص إلى DATE عندما لا تكون هناك حاجة إلى الوقت: محمي_INLINE_33.

الاختلافات والفواصل

يؤدي طرح اثنين من TIMESTAMP إلى الحصول على INTERVAL:

SQL
SELECT id,
       shipped_at - ordered_at AS wait_time
FROM   orders
WHERE  shipped_at IS NOT NULL;

مقارنات مع INTERVAL حرفي:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

إضافة أيام إلى تاريخ:

SQL
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM   customers;

جربه

تمرين#sql.m6.l2.e1
المحاولات: 0جارٍ التحميل…

احسب عدد الطلبات التي تم تقديمها سنويًا. عمودين: السنة (عدد صحيح) وorder_count. الترتيب حسب السنة تصاعديا.

جارٍ تحميل المحرر…
إظهار التلميح

EXTRACT(YEAR FROMorder_at) يُرجع رقمًا رقميًا: قم بتحويله إلى int باستخدام ::int لسهولة القراءة.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m6.l2.e2
المحاولات: 0جارٍ التحميل…

لكل شهر من عام 2024، قم بإظهار اليوم الأول من الشهر (عمود الشهر، نوع التاريخ) وعدد الطلبات. الطلب حسب الشهر.

جارٍ تحميل المحرر…
إظهار التلميح

DATE_TRUNC('month',order_at) يُرجع اليوم الأول من الشهر كطابع زمني؛ ::date يحوله إلى تاريخ.

الحل متاح بعد 3 من المحاولات