Дата и время: DATE, DATETIME, TIMESTAMP
Учимся хранить даты и время в MySQL и понимать, когда нужен DATETIME, а когда TIMESTAMP.
TIMESTAMP хранит момент времени с привязкой к часовому поясу и автоматически переводит его в UTC, а DATETIME хранит дату-время «как есть», без пояса.
Основные типы
| Тип | Хранит | Пример |
DATE | только дату | 2026-06-14 |
TIME | только время | 13:45:00 |
DATETIME | дату и время | 2026-06-14 13:45:00 |
TIMESTAMP | момент времени (в UTC) | 2026-06-14 13:45:00 |
YEAR | год | 2026 |
DATETIME против TIMESTAMP
Главная разница — в часовых поясах:
- DATETIME хранит ровно то, что вы записали, без преобразований. Диапазон огромный (с 1000 года).
- TIMESTAMP при записи переводит время в UTC, а при чтении — обратно в часовой пояс сессии. Удобно, если пользователи в разных поясах. Но диапазон ограничен (примерно 1970–2038).
Ещё у TIMESTAMP (а в новых версиях и у DATETIME) есть приятная автоматизация: значение по умолчанию и автообновление.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
);
Здесь created_at сам проставится в момент вставки, а updated_at будет автоматически обновляться при каждом UPDATE строки. Это MySQL-специфика, поэтому блок текстовый.
Функции для дат
MySQL даёт богатый набор функций: NOW(), CURDATE(), DATE_ADD(), DATEDIFF(), DATE_FORMAT().
SELECT NOW(); -- текущие дата и время
SELECT DATE_ADD('2026-06-14', INTERVAL 7 DAY); -- +7 дней
SELECT DATEDIFF('2026-06-20', '2026-06-14'); -- разница в днях: 6
SELECT DATE_FORMAT(NOW(), '%d.%m.%Y'); -- 14.06.2026
Переносимый пример с датами
Сравнение и сортировка по датам в формате ISO (ГГГГ-ММ-ДД) работают и в песочнице, потому что такие строки сравниваются лексикографически в правильном порядке:
CREATE TABLE events (
id INTEGER PRIMARY KEY,
title TEXT,
event_date TEXT
);
INSERT INTO events (title, event_date) VALUES
('Релиз', '2026-06-10'),
('Митап', '2026-06-20'),
('Деплой', '2026-06-14');
SELECT title, event_date
FROM events
WHERE event_date >= '2026-06-14'
ORDER BY event_date;
Вывод:
title event_date Деплой 2026-06-14 Митап 2026-06-20
Итог
DATE— дата,TIME— время,DATETIME/TIMESTAMP— дата+время.TIMESTAMPработает с часовыми поясами (хранит в UTC), но ограничен годами ~1970–2038.DATETIMEхранит время как есть, с большим диапазоном.- Автообновление
ON UPDATE CURRENT_TIMESTAMPудобно для поля «когда изменено».
Проверьте себя
1. В чём ключевое отличие TIMESTAMP от DATETIME в MySQL?
ATIMESTAMP хранит только дату без времени
BTIMESTAMP учитывает часовой пояс (хранит в UTC), DATETIME — нет
CDATETIME не может хранить время
Dмежду ними нет разницы
2. Что делает выражение ON UPDATE CURRENT_TIMESTAMP у столбца?
Aзапрещает изменение строки
Bавтоматически обновляет столбец текущим временем при каждом UPDATE строки
Cудаляет старое значение
Dпереводит время в другой пояс
3. Почему сортировка дат в формате 'ГГГГ-ММ-ДД' работает корректно даже как обычный текст?
Aпотому что база автоматически распознаёт даты
Bпотому что в этом формате лексикографический порядок совпадает с хронологическим
Cпотому что текст нельзя сортировать
Dэто случайность