09-06-2018 12:14

Как использовать в MySQL: timestamp и datetime

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

Ответственность за применение типов данных и смену часовых поясов лежит на разработчике, который должен учитывать время клиента и время сервера. Они не всегда совпадают.

Описание таблиц с полями времени

Доступ к результатам выборки через MySQL fetch arrayВам будет интересно:Доступ к результатам выборки через MySQL fetch array

В примере описаны три варианта представления времени. Два - типа MySQL timestamp (start_timestamp, next_timestamp), одна - типа MySQL datetime (start_datetime) и пользовательский вариант в виде строки символов (work_income).

Тип timestamp - это родной для MySQL формат времени фиксации событий, занимает 8 байт, является целым числом и имеет одну особенность: первая колонка заполняется автоматом в момент создания: запрос (1). Вторая и все следующие - остаются нулевыми, но это не NULL. Запрос (2) содержит функцию MySQL timestamp now(), применённую для заполнения поля start_datetime.

В этом примере видно, что таблица, сформированная запросом (1, создание таблицы) будет заполнять автоматом первую колонку start_timestamp при создании таблицы. Запрос (2, заполнение таблицы) показывает, что это именно так. При этом вторая колонка next_timestamp остается нулевой: все составляющие даты и времени представлены "0" во всех позициях, но не NULL, как всё поле целиком.

Если из запроса убрать ссылку на поле start_datetime и функцию, его заполняющую now(), то поле start_datetime будет содержать значение NULL. Верхняя часть картинки показывает таблицу с использованием функции заполнения, нижняя часть - таблицу без использования now(). Различия существенные.

Время юникс и пользовательское время

Поля таблицы MySQL timestamp & datetime отличаются по заполнению и использованию. Например, вариант:

  • int mktime ( [int hour [, int minute [, int second [, ...

доступен для поля типа datetime, в то время как поле типа timestamp больше ориентируется на функции самого языка MySQL.

С тем, чтобы использовать поля времени наиболее эффективно и безопасно, целесообразно ориентироваться на способ работы с MySQL timestamp в предлагаемом функционале, в том его назначении, которое определено самой базой данных. Это её собственный штамп момента времени, формат представления времени.

Тип datetime более относим ко времени в представлении эпохи юникс и его можно ассоциировать, например, с функцией PHP mktime() или обычным текстовым форматом, например:

Здесь переменная $cStndDate - обычный текст, который интерпретируется в запросе как что-то, написанное в формате даты/времени. Если переменная указана правильно, то в нужное поле таблицы запишется нужное значение.

Пользовательское время - это требование задачи. Далеко не всегда следует представлять базе данных все права по управлению временем. Она всегда все сделает «по-своему». Это не всегда правильно, например, нужны названия русских месяцев или особый порядок записи дня, месяца и года.

Часовые пояса и правильная логика

Работа с MySQL timestamp & datetime требует внимательности и аккуратности. Другое дело - собственный формат даты, записанный в виде обычного текста. Правда, в этом случае теряются достоинства стандартных типов даты, например, сортировка или вычисления над датами, но появляются желаемые преимущества.

В любом случае, разработчику следует быть предельно внимательным. Часовые пояса, настройки локализации и множество других нюансов могут создать определённое непонимание. Если что-то при работе с датой стало с NULL или нулями во всех позициях, нужно искать, прежде всего, ошибку в собственном алгоритме. MySQL, его поля даты и функции времени работают исключительно стабильно и правильно.



Источник