MySQL предоставляет разработчику возможность работать со временем различным образом. Имеются типы данных для описания полей в таблицах. Предлагается множество функций для применения в запросах. Доступна временная локализация и смена часовых поясов в сессиях, настройках MySQL и использование времени операционной системы.
Ответственность за применение типов данных и смену часовых поясов лежит на разработчике, который должен учитывать время клиента и время сервера. Они не всегда совпадают.
Описание таблиц с полями времени
Вам будет интересно:Доступ к результатам выборки через 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, его поля даты и функции времени работают исключительно стабильно и правильно.