Основи баз даних
VTFK • 2025
Лекція 12: MongoDB CRUD
Фокус: DATE, TIME, TIMESTAMP та операції
Спеціальні типи даних для представлення дат, часу та їх комбінацій.
Аналогія: Як спеціалізовані контейнери: коробка для дати, коробка для часу
Від простого до складного
| Тип | Формат | Розмір | Приклад |
|---|---|---|---|
| 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;
| Інтервал | Приклад | Результат |
|---|---|---|
| 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);
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;
VARCHAR для дат дозволяє неправильні значення
CREATE TABLE events (
event_date VARCHAR(255) -- неправильно
);
Можна вставити 'invalid-date', операції з датами не працюватимуть
CREATE TABLE events (
event_date DATE -- правильно
);
DATE перевіряє формат і дозволяє операції
Від дозволу до точності
YYYY-MM-DD
часові операції
AT TIME ZONE
мікросекунди
З датами та функціями
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;
Далі — ORDER BY та сортування
Лекція 14: ORDER BY
Дякую за увагу! 💾