ЛЕКЦІЯ 13

Дати та час у SQL

Основи баз даних

VTFK • 2025

Що вже вивчили

Лекція 12: MongoDB CRUD

  • Документи vs рядки
  • CRUD операції
  • Фільтри в MongoDB

План лекції

  • Типи дат/часу
  • Функції для роботи з датами
  • Часові зони
  • Практика: вибір діапазонів

Фокус: DATE, TIME, TIMESTAMP та операції

Навіщо дати/час важливі

Часові типи

Temporal Data Types

Спеціальні типи даних для представлення дат, часу та їх комбінацій.

Аналогія: Як спеціалізовані контейнери: коробка для дати, коробка для часу

Типи дат/часу

Від простого до складного

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph LR TemporalTypes[Часові типи] TemporalTypes --> DATE[DATE
2025-12-25] TemporalTypes --> TIME[TIME
14:30:45] TemporalTypes --> DATETIME[DATETIME
2025-12-25 14:30:45] TemporalTypes --> TIMESTAMP[TIMESTAMP
UTC timestamp] TemporalTypes --> INTERVAL[INTERVAL
різниця часу]

Типи дат в SQL

Тип Формат Розмір Приклад
DATE YYYY-MM-DD 3 B 2025-12-25
TIME HH:MM:SS 3 B 14:30:45
DATETIME YYYY-MM-DD HH:MM:SS 8 B 2025-12-25 14:30:45
TIMESTAMP epoch seconds 4/8 B 1640005200
YEAR YYYY 1 B 2025

Коли використовувати кожний тип

Приклад таблиці з датами

Магазин з замовленнями

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id INT,
  order_date DATE,
  order_time TIME,
  created_at TIMESTAMP DEFAULT now(),
  estimated_delivery DATE,
  status VARCHAR(20)
);

INSERT INTO orders VALUES
(1, 100, '2025-12-25', '14:30:45', now(), '2025-12-27', 'shipped');

Функції для дат

Функції роботи з датами

Практичні приклади

-- Поточна дата
SELECT NOW();  -- 2025-12-25 14:35:20

-- Додати 7 днів
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);

-- Різниця між датами (дні)
SELECT DATEDIFF(expected_date, order_date) AS days_to_deliver
FROM orders;

-- Витягнути рік
SELECT EXTRACT(YEAR FROM created_at) AS year
FROM orders;

-- Форматувати
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') AS formatted
FROM orders;

Інтервали для DATE_ADD

Інтервал Приклад Результат
SECOND DATE_ADD(now(), INTERVAL 30 SECOND) 30 сек далі
MINUTE DATE_ADD(now(), INTERVAL 10 MINUTE) 10 хв далі
HOUR DATE_ADD(now(), INTERVAL 2 HOUR) 2 год далі
DAY DATE_ADD(now(), INTERVAL 7 DAY) 7 днів далі
MONTH DATE_ADD(now(), INTERVAL 1 MONTH) 1 місяць далі
YEAR DATE_ADD(now(), INTERVAL 1 YEAR) 1 рік далі

Вибір по датам

Замовлення за період

-- Замовлення за останні 30 днів
SELECT * FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY);

-- Замовлення грудня
SELECT * FROM orders
WHERE EXTRACT(YEAR FROM created_at) = 2025
AND EXTRACT(MONTH FROM created_at) = 12;

-- Доставляються протягом 7 днів
SELECT * FROM orders
WHERE estimated_delivery BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 7 DAY);

Міні-вікторина

Як отримати замовлення за останні 7 днів?

  • WHERE created_at > NOW() - 7
  • WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  • WHERE DATEDIFF(created_at, NOW()) < 7
✅ Правильна відповідь: WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
💡 Пояснення:

DATE_SUB відовує дату на 7 днів назад правильно.

Часові зони

Робота з часовими зонами

Конвертація на приклад

-- Поточна дата в UTC
SELECT NOW();  -- UTC

-- Конвертіровать на конкретну зону (PostgreSQL)
SELECT created_at AT TIME ZONE 'UTC+2' FROM orders;

-- MySQL: встановіть session timezone
SET time_zone = '+02:00';
SELECT created_at FROM orders;

Помилка: STRING замість DATE

⚠️ ЗАСТЕРЕЖЕННЯ

VARCHAR для дат дозволяє неправильні значення

❌ Неправильно

CREATE TABLE events (
  event_date VARCHAR(255)  -- неправильно
);

Можна вставити 'invalid-date', операції з датами не працюватимуть

✓ Правильно

CREATE TABLE events (
  event_date DATE  -- правильно
);

DATE перевіряє формат і дозволяє операції

Історія часу у БД

Від дозволу до точності

1974

DATE базова

YYYY-MM-DD

1992

TIME додано

часові операції

2011

Часові зони

AT TIME ZONE

2025

Nano-precision

мікросекунди

Best practices датa/час

Міні ТЗ: аналіз за періодом

Комплексний запит

З датами та функціями

SELECT 
  id,
  user_id,
  created_at,
  estimated_delivery,
  DATEDIFF(estimated_delivery, created_at) AS days_to_delivery,
  DATE_FORMAT(created_at, '%d.%m.%Y') AS formatted_date
FROM orders
WHERE created_at >= '2025-12-01'
AND created_at < '2026-01-01'
AND estimated_delivery > NOW()
ORDER BY created_at DESC;

Підсумки

  • DATE для дат, TIME для часу, TIMESTAMP для обох
  • NOW() для поточного часу
  • DATE_ADD/SUB, DATEDIFF для обчислень

Далі — ORDER BY та сортування

Домашнє завдання

Наступна лекція:

Лекція 14: ORDER BY

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій