دروس الوحدة (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) يستخرج رقمًا:
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) "يقتطع" التاريخ بدقة. إنه كذلك
ضروري للتجميع حسب الشهر والأسبوع والساعة:
-- 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:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;مقارنات مع INTERVAL حرفي:
WHERE shipped_at - ordered_at > INTERVAL '1 day'إضافة أيام إلى تاريخ:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;جربه
احسب عدد الطلبات التي تم تقديمها سنويًا. عمودين: السنة (عدد صحيح) وorder_count. الترتيب حسب السنة تصاعديا.
إظهار التلميح
EXTRACT(YEAR FROMorder_at) يُرجع رقمًا رقميًا: قم بتحويله إلى int باستخدام ::int لسهولة القراءة.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
لكل شهر من عام 2024، قم بإظهار اليوم الأول من الشهر (عمود الشهر، نوع التاريخ) وعدد الطلبات. الطلب حسب الشهر.
إظهار التلميح
DATE_TRUNC('month',order_at) يُرجع اليوم الأول من الشهر كطابع زمني؛ ::date يحوله إلى تاريخ.
الحل متاح بعد 3 من المحاولات