Дата и время в MySQL: date format, сортировка и локализация
Естественное представление о времени - это даты: год, месяц, день и время: часы, минуты секунды. В некоторых приложениях имеют значение дни недели и доли секунд, но во всех приложениях и всегда необходимы инструменты для обработки переменных времени и их представления в естественном виде.
Время характеризуется местом в пространстве, где событие происходит и точкой, где оно может быть использовано. Это общий порядок, который определяет необходимость локализации и учёт часовых поясов.
MySQL: типы данных для записи времени
Формально, типы данных в системе управления базами данных MySQL составляет пять описателей (date, time, timestamp и year). Разработчик часто предпочитает универсальный вариант: char (20) - когда есть объективные основания использовать свою интерпретацию функции MySQL date_format() или обеспечить нужные условия для правильной сортировки.
В этом примере формируется таблица вариантов представления дат, и в неё вносятся две строки. Первая строка содержит данные в естественном формате, и в составе заполняемых полей отсутствует поле "x_timestamp". Вторая строка по всем полям использует функцию MySQL now(). Следует отметить, что указанное поле заполняется в обоих случаях.
Метка времени и её формат
Этот тип поля времени (timestamp) и использование функции MySQL date_format() чрезвычайно эффективно для создания меток времени. Это «не имеет никакого отношения» к любому алгоритму. Это не требует особых изысков в представлении даты или времени. Это просто временная метка - точка на линии развития событий.
Поле данного типа заполняется в момент создания строки. Нет необходимости уделять ему внимание, но всегда и в любом запросе можно положиться: MySQL date_format () datetime = время, когда строка была создана. Важно, естественно, никогда его не менять. Строка создана и время её создания определено лишь однажды. Читать можно, изменять нельзя.
У данного решения очень много сфер применения:
- протокол диалога с посетителем;
- лог журнала безопасности;
- отслеживание действий сотрудников;
- календарь событий;
- почтовый ящик и т. д.
Время - это, прежде всего, череда событий. Всё, что связано с веб-ресурсом, стремящемуся к совершенству, росту рейтинга и реальному отражению действительности так или иначе связано с правильным отображением времени:
- в том виде, как есть, - это не видно пользователю, но доступно разработчику;
- в том виде, как это должно быть отражено на веб-ресурсе, использовано в алгоритме, учтено в документе и т. д.
Время многогранно и зависит от той точки пространства, где произошло событие в контексте той точки пространства, где оно должно быть использовано или отображено.
Общий смысл MySQL select date_format()
Запрос на выборку информации - самая главная фраза на языке SQL. Она настолько востребована, что очень важно при формировании нужной выборки максимально быстро превращать её содержимое в надлежащий вид, не отягощая алгоритм дополнительными конструкциями.
С этой точки зрения MySQl date_format() позволяет оформлять любое значение даты и времени в тот формат, в который необходимо сразу в момент выполнения запроса.
В таблице содержатся две строки и имеются два одинаковых поля: "x_timestamp" и "x_datetime". Запрос обращается к этим двум полям, но указывает их имена, минуя PHP, в date MySQL format непосредственно.
Строка форматирования может быть любой. Содержание строки форматирования транслируется в результат запроса в формате «как есть» с заменой ключевых элементов формата «%*», где символ звёздочки означает символ формата: год, день, месяц, час.
Национальный формат времени и сортировка
Использование даты в стандарте типа MySQL - лучшее решение для использования функционала языка SQL. Нет проблем ни с сортировкой, ни с вычислениями, ни с форматированием в стиле MySQL date_format().
Но не во всех странах рабочая неделя начинается с воскресенья, не всегда считается нормальным представление времени в 12-часовом формате и не во всех языках есть понятия "AM" и "PM". Есть много такого рода национальных особенностей, но подавляющее большинство из них лежит за пределами функционала языка SQL.
Сомнительно, что вообще существует такой диалект SQL, который способен расшириться на учёт национального колорита стран дальше, чем за пределы термина "локализация". Собственно, не удивительно, что "локализация" на практике означает больше автозамену одних слов (сочетаний) на другие в зависимости от языка.
Но не всегда национальный язык определяет всё, в первую очередь, он никак не связан с правильным представлением времени.
Ключ событий и ключ данных
Время никогда не течёт вспять, следовательно, это идеальный ключ к любой строке, к любой таблице, к любой базе данных. Два события могут произойти одновременно, если интервал их отслеживания больше, чем разница во времени между их появлением. Например, два пользователя зашли на сайт в одну и ту же минуту, но в разные секунды этой минуты.
На PHP есть интересное решение: есть объект и есть экземпляр объекта. Есть идея статической «переменной»:
- private static $iUniqueNo = -1; // "УУ" всегда уникальное число
- // при каждом вызове этой функции $iUniqueNo будет другим и
- // в течение одной секунды никогда не повторится.
- public function IncUniqueNo() {
- if (self::$iUniqueNo > 99)
- self::$iUniqueNo = 0;
- else
- self::$iUniqueNo++;
- }
Не слишком фантазируя, сливая в единое целое: год, месяц, день, часы, минуты, секунды и $iUniqueNo, получаем: ГГГГММДДччммссУУ - уникальный ключ ("УУ" = "$iUniqueNo") для любой записи и одновременно штамп момента времени для любого использования.
Это идеальное решение в контексте типа времени базы данных и функции MySQL date_format(), которая элементарно делает и время, и ключ из одного поля "timestamp" одновременно.