Модульні уроки (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;Спробуйте
Підрахуйте, скільки замовлень було розміщено на рік. Два стовпці: year (ціле) і order_count. Впорядкувати за роком за зростанням.
Показати підказку
EXTRACT(YEAR FROM ordered_at) повертає NUMERIC: переведіть його до int за допомогою ::int для читабельності.
Рішення доступне після 3 спроб
Повторна вправа
Для кожного місяця 2024 року вкажіть перше число місяця (колонка місяць, типу дата) і кількість замовлень. Порядок по місяцях.
Показати підказку
DATE_TRUNC('month', ordered_at) повертає перший день місяця як мітку часу; ::date перетворює його на дату.
Рішення доступне після 3 спроб