Как часто вы встречали приложения, которые работают с датами и временем? Онлайн-заказы, расписания, история изменений в базе данных — все они зависят от правильного хранения времени. 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. В реальных проектах это помогает обрабатывать расписания, логировать события или отслеживать важные события в системе!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ