Перейти до основного вмісту
Модуль 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.

Різниці та інтервали

Віднімання двох TIMESTAMP дає 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Завантаження…

Підрахуйте, скільки замовлень було розміщено на рік. Два стовпці: year (ціле) і order_count. Впорядкувати за роком за зростанням.

Завантаження редактора…
Показати підказку

EXTRACT(YEAR FROM ordered_at) повертає NUMERIC: переведіть його до int за допомогою ::int для читабельності.

Рішення доступне після 3 спроб

Повторна вправа

вправи#sql.m6.l2.e2
Спроби: 0Завантаження…

Для кожного місяця 2024 року вкажіть перше число місяця (колонка місяць, типу дата) і кількість замовлень. Порядок по місяцях.

Завантаження редактора…
Показати підказку

DATE_TRUNC('month', ordered_at) повертає перший день місяця як мітку часу; ::date перетворює його на дату.

Рішення доступне після 3 спроб