ماڈیول اسباق (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
فرق اور وقفے
دو 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;اسے آزمائیں
شمار کریں کہ ہر سال کتنے آرڈر کیے گئے تھے۔ دو کالم: سال (انٹیجر) اور آرڈر_کاؤنٹ۔ سال چڑھتے ہوئے ترتیب دیں۔
اشارہ دکھائیں۔
EXTRACT(YEAR FROM ordered_at) ایک عدد واپس کرتا ہے: پڑھنے کی اہلیت کے لیے اسے ::int کے ساتھ int پر کاسٹ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
2024 کے ہر مہینے کے لیے، مہینے کا پہلا دن (کالم مہینہ، قسم کی تاریخ) اور آرڈرز کی تعداد دکھائیں۔ مہینے کے حساب سے آرڈر کریں۔
اشارہ دکھائیں۔
DATE_TRUNC('month', ordered_at) ٹائم اسٹیمپ کے طور پر مہینے کا پہلا دن لوٹاتا ہے؛ ::تاریخ اسے تاریخ میں بدلتی ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔