Коли справа доходить до роботи з даними, майже завжди з’являється щось, пов’язане з часом. Згадай розклади рейсів, дедлайни замовлень або дату, коли користувач зареєструвався на сайті. Все це — про час. І щоб з ним було зручно працювати, потрібні правильні інструменти. У PostgreSQL є спеціальні типи даних, які чудово справляються із задачами зберігання та обробки дат і часу.
Можна, звісно, записувати дату як звичайний рядок типу "2023-10-12", але це скоріше пастка, ніж рішення. Рядки не вміють порівнювати дати, не знають, що таке «плюс три дні», і взагалі не в курсі часових поясів. А от часові типи даних — в курсі всього цього і навіть більше. З ними і простіше, і надійніше, і швидше.
Тип DATE
Тип DATE використовується для зберігання тільки календарної дати, без вказання конкретного часу. Це зручно, якщо тобі треба працювати з датами як з окремими сутностями, наприклад, датою народження, початком відліку року і так далі.
Приклади використання:
-- Приклад створення таблиці з типом `DATE`
CREATE TABLE events (
event_name TEXT,
event_date DATE
);
-- Вставка даних
INSERT INTO events (event_name, event_date)
VALUES ('Конференція PostgreSQL', '2023-12-01'),
('День народження', '2023-10-12');
-- Запит на вибірку
SELECT * FROM events;
Результат:
| event_name | event_date |
|---|---|
| Конференція PostgreSQL | 2023-12-01 |
| День народження | 2023-10-12 |
Тип TIME
Тип TIME зберігає ТІЛЬКИ час, тобто години, хвилини і секунди. Він ідеально підходить для задач, пов’язаних з розкладами, наприклад, розкладом автобусів або інтервалами роботи магазинів.
Приклади:
-- Приклад створення таблиці з `TIME`
CREATE TABLE schedules (
schedule_name TEXT,
start_time TIME,
end_time TIME
);
-- Вставка даних
INSERT INTO schedules (schedule_name, start_time, end_time)
VALUES ('Робочий час', '09:00:00', '18:00:00'),
('Обідня перерва', '13:00:00', '14:00:00');
-- Запит на вибірку
SELECT schedule_name, start_time, end_time FROM schedules;
Результат:
| schedule_name | start_time | end_time |
|---|---|---|
| Робочий час | 09:00:00 | 18:00:00 |
| Обідня перерва | 13:00:00 | 14:00:00 |
Тип TIMESTAMP
Тип TIMESTAMP поєднує в собі календарну дату і час в одному значенні. Але він НЕ враховує часові пояси. Це може призвести до плутанини, якщо дані будуть використовуватись користувачами з різних часових поясів.
Приклади:
-- Приклад створення таблиці з `TIMESTAMP`
CREATE TABLE documents (
document_id SERIAL PRIMARY KEY,
created_at TIMESTAMP
);
-- Вставка даних
INSERT INTO documents (created_at)
VALUES ('2023-10-12 15:30:00'),
('2023-12-01 08:45:15');
-- Запит на вибірку
SELECT document_id, created_at FROM documents;
Результат:
| document_id | created_at |
|---|---|
| 1 | 2023-10-12 15:30:00 |
| 2 | 2023-12-01 08:45:15 |
Тип TIMESTAMPTZ
Тип TIMESTAMPTZ (де TZ означає "часовий пояс") схожий на TIMESTAMP, але додатково зберігає інформацію про часовий пояс. Це робить його незамінним для застосунків, які працюють з міжнародними користувачами.
Приклади:
-- Приклад створення таблиці з `TIMESTAMPTZ`
CREATE TABLE meetings (
meeting_id SERIAL PRIMARY KEY,
meeting_time TIMESTAMPTZ
);
-- Вставка даних (PostgreSQL зберігає поточний часовий пояс)
INSERT INTO meetings (meeting_time)
VALUES ('2023-10-12 15:30:00+03'),
('2023-12-01 08:45:15-05');
-- Запит на вибірку
SELECT meeting_id, meeting_time FROM meetings;
Результат:
| meeting_id | meeting_time |
|---|---|
| 1 | 2023-10-12 15:30:00+03:00 |
| 2 | 2023-12-01 08:45:15-05:00 |
Зверни увагу, що PostgreSQL автоматично перетворює час до часового поясу сервера.
Переваги використання спеціалізованих типів даних
Коректність даних. Типи, такі як DATE і TIMESTAMP, не дають ввести некоректні дані. Наприклад, не можна записати неіснуючу дату, як "2023-02-30".
Зручність роботи. Ти можеш порівнювати дати, віднімати їх одна від одної, отримувати поточну дату і навіть округляти значення (про це поговоримо далі).
Продуктивність. Часові типи даних займають менше місця в пам’яті та індексах, ніж рядки, що прискорює виконання запитів.
Приклад: створення таблиці з використанням усіх типів
Давай створимо більш складну таблицю для зберігання розкладу подій. Ми використаємо одразу кілька типів: DATE, TIME, TIMESTAMP і TIMESTAMPTZ.
CREATE TABLE event_schedule (
event_id SERIAL PRIMARY KEY,
event_name TEXT NOT NULL,
event_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
full_start TIMESTAMP NOT NULL,
full_start_with_zone TIMESTAMPTZ NOT NULL
);
-- Вставляємо дані
INSERT INTO event_schedule (
event_name, event_date, start_time, end_time, full_start, full_start_with_zone
)
VALUES
('Ранковий міт-ап', '2023-11-10', '10:00:00', '11:30:00', '2023-11-10 10:00:00', '2023-11-10 10:00:00+03'),
('Вечірній воркшоп', '2023-11-11', '18:00:00', '20:00:00', '2023-11-11 18:00:00', '2023-11-11 18:00:00+03');
-- Перевіряємо дані
SELECT * FROM event_schedule;
Результат:
| event_id | event_name | event_date | start_time | end_time | full_start | fullstartwith_zone |
|---|---|---|---|---|---|---|
| 1 | Ранковий міт-ап | 2023-11-10 | 10:00:00 | 11:30:00 | 2023-11-10 10:00:00 | 2023-11-10 10:00:00+03:00 |
| 2 | Вечірній воркшоп | 2023-11-11 | 18:00:00 | 20:00:00 | 2023-11-11 18:00:00 | 2023-11-11 18:00:00+03:00 |
Це приклад реальної бази даних для керування розкладами. Ми бачимо, як різні формати часових даних доповнюють одне одного, залежно від задачі.
Сподіваюсь, ти згадав, як використовувати типи DATE, TIME, TIMESTAMP і TIMESTAMPTZ у PostgreSQL. У наступних лекціях ми глибше зануримось у роботу з часовими функціями і навчимось витягувати, форматувати та керувати часовими даними за допомогою SQL-запитів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ