JavaRush /Курси /SQL SELF /Типи даних для роботи з часом і датами: DATE

Типи даних для роботи з часом і датами: DATE, TIME, TIMESTAMP, TIMESTAMPTZ

SQL SELF
Рівень 31 , Лекція 0
Відкрита

Коли справа доходить до роботи з даними, майже завжди з’являється щось, пов’язане з часом. Згадай розклади рейсів, дедлайни замовлень або дату, коли користувач зареєструвався на сайті. Все це — про час. І щоб з ним було зручно працювати, потрібні правильні інструменти. У 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-запитів.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ