שיעורי מודול (2/4)
פונקציות תאריך וחותמת זמן
תאריכים וחותמות זמן נמצאים בכל מקום: הזמנות, כניסות, אירועים, חיוב. ב בשיעור זה נראה כיצד לחלץ חלקים מתאריך (שנה, חודש...), קטוע אותו לפירוט (חודש, שבוע...), מחשב מרווחים והבדלים, ולבצע השוואות בין תקופות.
סוגי הבסיס
PostgreSQL מבדיל:
DATE- תאריך בלבד, פורמטYYYY-MM-DD;TIMESTAMP- תאריך + שעה, ללא אזור זמן;TIMESTAMPTZ- תאריך + זמן + אזור זמן;INTERVAL- נקודה (למשל'3 days','2 hours 30 minutes').
במערך הנתונים ecommerce שלנו:
| עמודה | הקלד |
|---|---|
customers.signed_up_on | DATE |
orders.ordered_at | TIMESTAMP |
orders.shipped_at | TIMESTAMP (יכול להיות NULL) |
חילוץ - קריאת חלק
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), DOY (יום בשנה).
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 כאשר אין צורך בזמן:
DATE_TRUNC('month', ordered_at)::date.
הבדלים ומרווחים
הפחתת שתי TIMESTAMPs מייצרת 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 FROM ordered_at) מחזירה NUMERIC: העבר אותו ל-int עם ::int לקריאה.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
עבור כל חודש של 2024, הצג את היום הראשון של החודש (חודש העמודה, מתאריך הסוג) ואת מספר ההזמנות. הזמנה לפי חודש.
הצג רמז
DATE_TRUNC('month', ordered_at) מחזירה את היום הראשון של החודש כחותמת זמן; ::date ממיר אותו לתאריך.
הפתרון זמין לאחר 3 ניסיונות