Навигация

Поиск по Сайту

Партнеры

Самоучитель. Книги.

Статистика

    Каталог@Mail.ru - каталог ресурсов интернет

Типы DATETIME, DATE и TIMESTAMP в MySQL

Главная Страница » Книги по PHP » MySQL уроки для начинающих с нуля » Типы DATETIME, DATE и TIMESTAMP в MySQL

Типы DATETIME, DATE и TIMESTAMP связаны. Этот раздел описывает их характе¬ристики и различия.

Тип DATETIME используется, когда вы нуждаетесь в значениях, содержащих информацию о дате и времени. MySQL получает и отображает значения DATETIME в формате YYYY-MM-DD HH:MM:SS. Поддерживаемый диапазон: от 1000-01-01 00:00:00 до 9999-12-31 23:59:59.

Тип DATE используется, когда вы нуждаетесь только в значении даты, без значения времени. MySQL получает и отображает значения DATE в формате YYYY-MM-DD. Поддерживаемый диапазон: от 1000-01-01 до 9999-12-31.

Тип столбца TIMESTAMP обеспечивает тип, который вы можете использовать, чтобы автоматически отметить операции INSERT или UPDATE текущей датой и временем. Для этого следует ввести в таблицу столбец типа TIMESTAMP. Теперь при любом обновлении записи, он будет автоматически установлен в дату и время модификации, что весьма полезно в целях отслеживания изменений. Если вы имеете в таблице много столбцов типа TIMESTAMP, только первый из них модифицируется автоматически.

Автоматическое модифицирование первого столбца TIMESTAMP происходит при любом из ниже перечисленных условий:

  • этот столбец не определен явно в инструкции INSERT или LOAD DATA INFILE;
  • столбец не определен явно в инструкции UPDATE и некотором другом значении изменений столбца. Обратите внимание, что UPDATE, который устанавливает столбец к значению, уже закрепленному за ним, не приведет к модификации столбца типа TIMESTAMP, так как, если вы устанавливаете столбец к текущему значению, MySQL игнорирует модификацию для повышения эффективности;
  • вы явно устанавливаете столбец типа TIMESTAMP в NULL.

Второй и последующие столбцы типа TIMESTAMP также могут быть установлены к текущей дате и времени. Для этого установите соответствующий столбец в значение NULL или в NOW().

Вы можете устанавливать любой столбец TIMESTAMP к значению иному, чем текущая дата и время, устанавливая это значение явно. Это истинно даже для первого столбца TIMESTAMP. Вы можете использовать это свойство, если, например, хотите, чтобы TIMESTAMP был установлен к текущей дате и времени, когда вы создаете строку, но не изменялся в дальнейшем всякий раз, когда строка модифицируется:

  • позвольте MySQL установить столбец, когда строка создана. Это инициализирует переменную и установит ее в текущую дату и время;
  • когда вы выполняете последующие модификации других столбцов в строке, установите столбец TIMESTAMP явно в нужное значение.

Значения TIMESTAMP имеют точность в одну секунду. Значения отображаются как числа.

Формат, в котором MySQL получает и отображает значения TIMESTAMP, зави¬сят от размера отображения, как проиллюстрировано табл. 5.2. Полный формат TIMESTAMP содержит 14 цифр, но столбцы могут быть созданы с более мелким форматом отображения:

Таблица 5.2. Формат отображения столбцов TIMESTAMP.

Тип столбца Формат отображения
TIMESTAMP (14) YYYYMMDDHHMMSS
TIMESTAMP (12) YYMMDDHHMMSS
TIMESTAMP (10) YYMMDDHHMM
TIMESTAMP (8) YYYYMMDD
TIMESTAMP (6) YYMMDD
TIMESTAMP (4) YYMM
TIMESTAMP (2) YY

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

Наиболее распространенные размеры: 6, 8, 12 и 14. Вы можете определять произвольный размер при создании таблицы, но значения, равные 0 или больше 14, будут установлены как 14. Нечетные размеры в диапазоне от 1 до 13 будут приведены к следующему четному числу.

Вы можете определять значения DATETIME, DATE и TIMESTAMP, использующие любой из общего набора форматов:

  • строка в формате YYYY-MM-DD HH:MM:SS или YY-MM-DD HH:MM:SS. Облегченный синтаксис позволяется: любой символ пунктуации может использоваться как разделитель между частями даты или частями времени. Например, 98-12-31 11:30:45, 98.12.31 11+30+45, 98/12/31 11*30*45 и 98@12@31 11Л30М5 равны;
  • строка в формате YYYY-MM-DD или YY-MM-DD. Облегченный синтаксис позволяется и здесь: например, строки 98-12-31, 98.12.31, 98/12/31 и 98@12@31 являются эквивалентными;
  • строка вообще без разделителей в формате YYYYMMDDHHMMSS или YYMMDDHHMMSS, при условии, что строка имеет смысл как дата. Например, 19970523091528 и 970523091528 интерпретируются как 1997-05-23 09:15:28, но 971122129015 запрещен (имеет неправильную минутную часть) и превращается в 0000-00-00 00:00:00;
  • строка без разделителей в формате YYYYMMDD или YYMMDD, при условии, что строка имеет смысл как дата. Например, 19970523 и 970523
  • интерпретируются как 1997-05-23, но 971332 запрещен (имеет неправильную часть месяца) и становится 0000-00-00;
  • число в формате YYYYMMDDHHMMSS или YYMMDDHHMMSS, при условии, что число имеет смысл как дата. Например, 19830905132800 и 830905132800 интерпретируются как 1983-09-05 13:28:00;
  • число в формате YYYYMMDD или YYMMDD при условии, что число имеет смысл как дата. Например, 19830905 и 830905 интерпретируются как 1983-09-05;
  • результат функции, которая возвращает значение, приемлемое в контексте DATETIME, DATE или TIMESTAMP, вроде NOW(), или CURRENT_DATE.

Запрещенные значения DATETIME, DATE или TIMESTAMP будут преобразованы в нулевое значение соответствующего типа (0000-00-00 00:00:00, 0000-00-00 или 00000000000000 соответственно).

Для значений, определенных как строки, включающие разделители частей даты, не требуется определять две цифры для значений месяца или дня, меньших, чем 10: 1979-6-9, эквивалентно 1979-06-09. Точно так же для значений, определенных как строки, которые включают разделители части времени, необязательно определять две цифры для значений часа, минуты или секунды, которые меньше, чем 10: 1979-10-30 1:2:3 задает то же самое, что и 1979-10-30 01:02:03.

Значения, определенные как числа, должны быть длиной в б, 8,12 или 14 цифр. Если число длиной в 8 или 14 цифр, то считается, что оно в формате YYYYMMDD или YYYYMMDDHHMMSS, и что год задан первыми 4 цифрами. Если число длиной в б или 12 цифр, считается, что оно в формате YYMMDD или YYMMDDHHMMSS, и что год задан первыми 2 цифрами. Числа, которые не соответствуют этим длинам, дополняются нулями до самой близкой длины.

Значения, определенные как неразграниченные строки интерпретируются, согласно их длине, как она есть. Это означает, что вы не должны использовать строки короче шести символов. Например, если вы определяете 9903, думая, что представите март 1999 года, вы очень скоро найдете, что MySQL подставляет ноль для даты в вашу таблицу. Это потому, что значения года и месяца 99 и 03, но часть дня пропущена, так что значение не является допустимой датой. Везде применяется формат год-месяц-день.

Столбцы TIMESTAMP сохраняют допустимые значения, используя точность, с которой значение было определено, независимо от размера отображения. Поэтому:

  • всегда определяйте год, месяц и день, даже если ваш тип столбца TIMESTAMP(4) или TIMESTAMP(2). Иначе, значение не будет допустимой датой, а будет сохранен 0;
  • если вы используете ALTER TABLE (обсуждается позже), чтобы расширить узкий столбец TIMESTAMP, начнет отображаться та информация, которая раньше была скрыта. То есть эта информация в столбце есть (и всегда была), но не показывалась из-за размера отображения!
  • точно так же сужение столбца TIMESTAMP не уничтожит информацию, просто меньшее количество информации будет показываться, когда отображаются значения столбца. Но значение все равно хранится полностью;
  • хотя значения TIMESTAMP сохранены со всей точностью, только функция UNIX_TIMESTAMP() распространяется непосредственно на основное сохраненное значение. Другие функции имеют дело с форматируемым значением. Вы не можете использовать функции типа HOUR() или SECOND(), если релевантная часть значения TIMESTAMP не включена в форматируемое значение (они получают данные с учетом размера отображения, а значит, просто не увидят нужных данных). Например, часть НН столбца TIMESTAMP не отображается, если размер отображения меньше 10. Причем не отображается не только для пользователя, но и для внутренних функций самого сервера.

Вы можете до некоторой степени назначать значения одного типа даты объекту иного типа даты. Однако, может иметься некоторое изменение значения или потеря информации при таком подходе:

  • если вы назначаете значение DATE объекту DATETIME или TIMESTAMP, часть времени, возникающего в результате значения будет установлена в 00:00:00 потому, что значение DATE не содержит информацию для времени;
  • если вы устанавливаете для объекта DATE значение DATETIME или TIMESTAMP, значения времени удаляются, потому что тип DATE не сохраняет информацию о времени;
  • не забудьте, что, хотя DATETIME, DATE и TIMESTAMP могут быть определены с использованием того же самого набора форматов, они имеют разный диапазон значений. Например, значение. TIMESTAMP не может быть ранее, чем 1970, или позже, чем 2037. Это означает, что дата типа 1968-01-01, которая вполне нормальна для DATETIME или DATE, недопустима для переменной типа TIMESTAMP и превратится в 0. В общем, будьте осмотрительны!

Знайте некоторые ловушки при определении значений даты:

  • ослабленный или упрощенный формат, допустимый для значений, определенных как строки, безусловно, хорош и удобен, но может обманывать. Например, значение типа 10:11:12 могло бы напоминать значение времени из-за разделителя, но если оно используется в контексте даты, то будет интерпретироваться как год 2010-11-12. Значение 10:45:15 будет преобразовано в 0000-00-00 потому, что 45 задает недопустимый месяц;
  • значения года, определенные как две цифры, неоднозначны потому, что столетие неизвестно. MySQL интерпретирует их так, как рассказано выше.