דילוג לתוכן המרכזי
מודול 6 · שיעור 2 מתוך 422/57 בקורס~12 min
שיעורי מודול (2/4)

פונקציות תאריך וחותמת זמן

תאריכים וחותמות זמן נמצאים בכל מקום: הזמנות, כניסות, אירועים, חיוב. ב בשיעור זה נראה כיצד לחלץ חלקים מתאריך (שנה, חודש...), קטוע אותו לפירוט (חודש, שבוע...), מחשב מרווחים והבדלים, ולבצע השוואות בין תקופות.

סוגי הבסיס

PostgreSQL מבדיל:

  • DATE - תאריך בלבד, פורמט YYYY-MM-DD;
  • TIMESTAMP - תאריך + שעה, ללא אזור זמן;
  • TIMESTAMPTZ - תאריך + זמן + אזור זמן;
  • INTERVAL - נקודה (למשל '3 days', '2 hours 30 minutes').

במערך הנתונים ecommerce שלנו:

עמודההקלד
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (יכול להיות NULL)

חילוץ - קריאת חלק

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), DOY (יום בשנה).

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 כאשר אין צורך בזמן: DATE_TRUNC('month', ordered_at)::date.

הבדלים ומרווחים

הפחתת שתי TIMESTAMPs מייצרת 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 FROM ordered_at) מחזירה NUMERIC: העבר אותו ל-int עם ::int לקריאה.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m6.l2.e2
ניסיונות: 0טוען...

עבור כל חודש של 2024, הצג את היום הראשון של החודש (חודש העמודה, מתאריך הסוג) ואת מספר ההזמנות. הזמנה לפי חודש.

טוען עורך...
הצג רמז

DATE_TRUNC('month', ordered_at) מחזירה את היום הראשון של החודש כחותמת זמן; ::date ממיר אותו לתאריך.

הפתרון זמין לאחר 3 ניסיונות