JavaRush /Курсы /SQL SELF /Типы данных для работы с датой и временем: DATE

Типы данных для работы с датой и временем: DATE, TIME, TIMESTAMP

SQL SELF
15 уровень , 4 лекция
Открыта

Как часто вы встречали приложения, которые работают с датами и временем? Онлайн-заказы, расписания, история изменений в базе данных — все они зависят от правильного хранения времени. PostgreSQL предоставляет мощные инструменты для работы с такими данными, и, конечно, таблицы со временем — это не страшные таблички с часами и минутами, а чёткая структура, позволяющая анализировать и упорядочивать события.

Типы для даты и времени позволяют:

  • Хранить только дату DATE, только время TIME или и то, и другое вместе TIMESTAMP.
  • Выполнять операции, такие как добавление дней, вычисление разницы между датами и фильтрация записей по временным критериям.
  • Работать с временными зонами (но это тема для будущих лекций).

Типы данных: DATE, TIME, TIMESTAMP

Тип данных DATE

Тип DATE предназначен для хранения только даты, без времени. Он записывает год, месяц и день. Этот тип полезен, когда:

  • Нужно хранить день рождения пользователя.
  • Дата события важна, но время не имеет значения.

Пример формата: YYYY-MM-DD (год-месяц-день).

Пример:

id name - VARCHAR(100) event_date - DATE
1 SQL Workshop 2025-06-15
2 Python 2025-06-17
3 Java Courses 2025-06-25

Тип данных TIME

Тип TIME используется для хранения только времени. Он полезен, когда:

  • Нужно сохранить расписание, например, начало рабочего дня.
  • Время имеет значение, но дата — нет.

Пример формата: HH:MI:SS (часы:минуты:секунды).

Пример:

id task_name - VARCHAR(100) start_time - TIME
1 Team Meeting 09:00:00
2 Code Review 11:30:00
3 Client Call 15:00:00

Тип данных TIMESTAMP

TIMESTAMP — это сочетание даты и времени. Он полезен, когда:

  • Нужно записать момент времени, например, когда пользователь вошёл в систему.
  • Необходима временная отметка для отслеживания изменений (логирование).

Пример формата: YYYY-MM-DD HH:MI:SS (год-месяц-день часы:минуты:секунды).

Пример:

id action - VARCHAR(100) login_time - TIMESTAMP
1 User Login 2023-10-15 14:30:00
2 File Uploaded 2023-10-15 15:10:00
3 User Logout 2023-10-15 16:45:00

Операции с датой и временем

Теперь, когда мы знаем, какие типы существуют, давайте разберёмся, как с ними работать. PostgreSQL предоставляет множество встроенных функций для выполнения операций с датами и временем.

Извлечение частей даты и времени

Если у вас есть временная метка (TIMESTAMP), и вы хотите вытащить только год, месяц, день или час, используйте функцию EXTRACT.

Пример:

SELECT EXTRACT(YEAR FROM TIMESTAMP '2025-06-15 14:30:00') AS year;
-- Результат: 2025

SELECT EXTRACT(MONTH FROM TIMESTAMP '2025-06-15 14:30:00') AS month;
-- Результат: 06

SELECT EXTRACT(DAY FROM TIMESTAMP '2025-06-15 14:30:00') AS day;
-- Результат: 15

Добавление и вычитание временных интервалов

Хотите узнать, что будет через неделю? Или что было вчера? Воспользуйтесь операциями с интервалами.

Пример:

-- Добавление 7 дней к текущей дате
SELECT CURRENT_DATE + INTERVAL '7 days' AS next_week;

-- Вычитание 1 месяца
SELECT CURRENT_DATE - INTERVAL '1 month' AS last_month;

Сравнение дат

Как узнать, что событие уже наступило? Проще, чем найти баг в коде — просто сравните значения.

Пример:

SELECT event_date
FROM events
WHERE event_date < CURRENT_DATE;
-- Выбираем все события в прошлом

Подробнее про функции работы со временем и датой вы узнаете в следующих лекциях. Пока просто запомните, что такие типы есть — этого будет достаточно.

Проблемы временных зон и стандарт времени

Хоть в этой лекции мы ещё не будем вдаваться в подробности о временных зонах, важно упомянуть, что PostgreSQL поддерживает тип TIMESTAMPTZ (отметка времени с учётом временной зоны). Например, 2023-10-15 14:30:00+02 показывает, что это время относится к часовому поясу UTC+2.

Мы обязательно разберем эту тему в нашем курсе, только позднее :P

Пример

Теперь пора проверить на практике наши новообретённые знания. Создадим таблицу, которая будет хранить расписание занятий студентов.

id subject_name class_date - DATE start_time - TIME end_time - TIME created_at - TIMESTAMP
1 Mathematics 2023-10-16 09:00:00 10:30:00 2023-10-12 14:00:00
2 Physics 2023-10-16 11:00:00 12:30:00 2023-10-12 14:00:00
3 Chemistry 2023-10-17 09:00:00 10:30:00 2023-10-12 14:01:00
4 Literature 2023-10-17 11:00:00 12:30:00 2023-10-12 14:01:00
5 Computer Science 2023-10-18 10:00:00 11:30:00 2023-10-12 14:02:00

Через пару лекций вы будете создавать такие таблицы в базе с помощью SQL-запросов. А пока просто любуемся :)

Типичные ошибки

Формат даты и времени: при вставке данных важно соблюдать правильный формат: YYYY-MM-DD для дат и HH:MI:SS для времени. PostgreSQL может не понять, если вы попытаетесь вставить дату как "15/10/2023".

Несоответствие типов данных: попытка записать текстовое значение в поле типа DATE приведёт к ошибке.

Ошибки временных интервалов: если вы добавляете, например, 30 дней к февралю, PostgreSQL корректно обработает это, но дата может оказаться уже в марте.

Теперь вы знакомы с типами данных для работы с датой и временем в PostgreSQL. В реальных проектах это помогает обрабатывать расписания, логировать события или отслеживать важные события в системе!

2
Задача
SQL SELF, 15 уровень, 4 лекция
Недоступна
Извлечение частей времени из TIMESTAMP
Извлечение частей времени из TIMESTAMP
2
Задача
SQL SELF, 15 уровень, 4 лекция
Недоступна
Создание расписания встреч
Создание расписания встреч
1
Опрос
Числовые типы данных, 15 уровень, 4 лекция
Недоступен
Числовые типы данных
Числовые типы данных
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Maria Уровень 20
27 февраля 2026
TIMESTAMPTZ дальше будет?
JaFFar Уровень 25
23 июля 2025
В задаче "Создание расписания встреч", ошибки при сравнении дат/времени (возникают попеременно, то работает, то нет), в консоли DBeaver на Pgs v.17.5 работает: ERROR: operator does not exist: date > date LINE 7: where now()::date > meeting_date; ^ HINT: No operator matches the given name and argument types. You might need to add explicit type casts. ИЛИ ERROR: operator does not exist: date > date LINE 8: where cast(now() as date) > meeting_date; ^ HINT: No operator matches the given name and argument types. You might need to add explicit type casts. ИЛИ ERROR: column "meeting_date" is of type date but expression is of type timestamp without time zone LINE 5: where CURRENT_DATE > meeting_date ; ^ HINT: You will need to rewrite or cast the expression. Что я делаю не так?
Евгений Уровень 49 Expert
31 июля 2025
now()::date > meeting_date - тут можешь CURRENT_DATE использовать лучше cast(now() as date) > meeting_date - тут тоже CURRENT_DATE > meeting_date - попробуй местами поменять, у тебя же логическая ошибка тут, а там валидатор хитрый немного 😀 он может вообще неправильно ошибку писать, но проверять логику.
Slevin Уровень 57
8 сентября 2025
ну вообще по логике задания надо сравнивать что meeting_date БОЛЬШЕ (позже). НУ и приводить now() в тип date, когда есть специализированное current_date

WHERE meeting_date > current_date
Ну и в решении там неплохой хинт написан, что в PostgreSQL при сложении объектов Date и Time - получаем Timestamp:

WHERE (meeting_date + meeting_time) > now()