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-запросов.

2
Задача
SQL SELF, 31 уровень, 0 лекция
Недоступна
Расписание событий с типами TIME и TIMESTAMP
Расписание событий с типами TIME и TIMESTAMP
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 53
16 февраля 2026
Чем дальше в курс тем проще код.
Vlad Tagunkov Уровень 17
18 января 2026
в курсе везде говориться что выбор * - это анти паттерн. но в задаче это требование. делайте именно так.
Евгений Уровень 49 Expert
8 сентября 2025
Задание странное: всё уже сделано до нас, надо просто запрос на получение данных написать. Кстати, хочу сказать, что я в работе ни разу (либо так редко, что не помню) не сталкивался с временем с временной зоной в базе данных. Конечно, должны быть ситуации, когда временная зона нужна, но обычно проще хранить время в базе данных по Гринвичу (+00:00) и конвертировать его с учётом подходящей временной зоны там, где идёт непосредственное взаимодействие с пользователем, например, на фронтенде. Иначе разработчик замучается работать со временем в рамках бизнес-логики 😏