Дата и время: 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это случайность
Поддержать проект