Mysql тип данных timestamp. Типы данных столбцов. Использование календарных типов данный в MySQL

Mysql тип данных timestamp. Типы данных столбцов. Использование календарных типов данный в MySQL

11.04.2019

Даты и времени YEAR, TIME, TIMESTAMP, DATE и DATETIME имеют собственный интервал допустимых значений, среди которых и значение «ноль», использующееся при введении пользователем действительно недопустимого значения.

Заметим, что MySQL может хранить некоторые не совсем достоверные значения даты, к примеру, 1999-11-31. Причиной тому является то, что управлять проверкой даты должно конкретное приложение, а не SQL-сервер. Чтобы ускорить проверку правильности даты, MySQL проверяет попадание месяца в интервал 0–12 и дня в интервал 0–31. Эти интервалы начинаются с 0 с той целью, чтобы MySQL мог хранить в столбцах DATETIME или DATE даты с днем и месяцем равным 0. Такой вариант полезен, например, для приложений, предполагающих хранение даты рождения, когда не всегда известен месяц или день рождения. Тогда хранение даты происходит в виде 1999-00-00 или 1999-01-00 (для таких дат функции DATE_ADD или DATE_SUB() могут дать неправильные значения).

MySQL интерпретирует значения в нескольких форматах, но всегда ожидается, что даты задаются в порядке год-месяц-день (к примеру, "99-08-05"). Значение, которое имеет тип даты или времени, автоматически преобразуется MySQL в число, когда данную величину используют в виде числа, и наоборот.

Значение, которое имеет тип даты или времени и выходит за границы указанного интервала или недопустимо для данного типа данных, MySQL преобразует в значение «ноль». Исключением являются величины типа TIME, которые выходят за границы установленного интервала и усекаются до граничной точки заданного интервала TIME.

В таблице рассмотрены форматы значения «ноль» для каждого типа столбцов:

Проблема 2000 года для типов данных

MySQL устойчив к «проблеме 2000 года», но некоторые входные величины могут стать источниками ошибок. Например, если ввести двухразрядное значение года, то оно будет интерпретироваться неоднозначно, т.к. не указано столетие. Такие значения должны переводиться в четырехразрядную форму, поскольку MySQL для представления года использует 4 разряда.

Даты с неоднозначным годом в MySQL для типов YEAR, TIMESTAMP, DATE и DATETIME интерпретируются согласно правилам:

  • значение года от 00 до 69 конвертируется в 2000–2069;
  • значение года от 70 до 99 конвертируется в 1970–1999.

Тип TIMESTAMP

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

Тип DATE

Тип DATE содержит величины с информацией о дате в формате "YYYY-MM-DD". Для данного типа год может изменяться в пределах диапазона 1000–9999, а значения месяца и числа в пределах года. Т.е. данные обрабатываются в диапазоне "1000-01-01"–"9999-12-31".

Тип DATETIME

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

Тип TIME

MySQL обрабатывает значения данного типа в формате "HH:MM:SS". Для больших значений часа (при указании временного интервала) используется формат "HHH:MM:SS". Значения TIME должны попадать в диапазон от "-838:59:59" до "838:59:59".

Тип YEAR

Тип данных YEAR является однобайтным и содержит значение года.

MySQL обрабатывает значения в формате YYYY и диапазоне от 1901 до 2155.

Недопустимые значения YEAR преобразуются в 0000.

типы данных даты и времени : DATETIME , DATE , TIMESTAMP , TIME и YEAR . Каждый из них имеет интервал допустимых значений, а также значение "ноль", которое используется, когда пользователь вводит действительно недопустимое значение. Отметим, что MySQL позволяет хранить некоторые не вполне достоверные значения даты, например 1999-11-31. Причина в том, что управление проверкой даты входит в обязанности конкретного приложения, а не SQL-серверов. Для ускорения проверки правильности даты MySQL только проверяет, находится ли месяц в интервале 0-12 и день в интервале 0-31. Данные интервалы начинаются с 0, это сделано для того, чтобы обеспечить для MySQL возможность хранить в столбцах DATE или DATETIME даты, в которых день или месяц равен нулю. Эта возможность особенно полезна для приложений, которые предполагают хранение даты рождения - здесь не всегда известен день или месяц рождения. В таких случаях дата хранится просто в виде 1999-00-00 или 1999-01-00 (при этом не следует рассчитывать на то, что для подобных дат функции DATE_SUB() или DATE_ADD дадут правильные значения).

MySQL извлекает значения для данного типа даты или времени только в стандартном формате, но в то же время пытается интерпретировать разнообразные форматы, которые могут поступать от пользователей (например, когда задается величина, которой следует присвоить тип даты или времени или сравнить со значением, имеющим один из этих типов). Тем не менее, поддерживаются только форматы, описанные в следующих разделах. Предполагается, что пользователь будет вводить допустимые значения величин, так как использование величин в других форматах может дать непредсказуемые результаты.

  • Хотя MySQL пытается интерпретировать значения в нескольких форматах, во всех случаях ожидается, что крайним слева будет раздел значения даты, содержащий год. Даты должны задаваться в порядке год-месяц-день (например, "98-09-04"), а не в порядке месяц-день-год или день-месяц-год, т.е. не так, как мы их обычно записываем (например "09-04-98", "04-09-98").
  • MySQL автоматически преобразует значение, имеющее тип даты или времени, в число, если данная величина используется в числовом контексте, и наоборот.
  • Значение, имеющее тип даты или времени, которое выходит за границы установленного интервала или является недопустимым для этого типа данных (см. начало раздела), преобразуется в значение "ноль" для данного типа. (Исключение составляют выходящие за границы установленного интервала величины типа TIME , которые усекаются до соответствующей граничной точки заданного интервала TIME ). В таблице 4.3 . представлены форматы значения "ноль" для каждого из типов столбцов:
  • Значения "ноль" - особые. Для их хранения или ссылок на них можно явно применять представленные в таблице значения, а можно использовать "0", что легче в написании.
Типы данных 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 также можно задать установку в значение текущих даты и времени. Для этого необходимо просто установить столбец в NULL или в NOW() .

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

Величины типа TIMESTAMP могут принимать значения от начала 1970 года до некоторого значения в 2037 году с разрешением в одну секунду. Эти величины выводятся в виде числовых значений.

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

Таблица 4.4. Формат данных TIMESTAMP в зависимости от количества извлекаемых разрядов
Тип столбца Формат вывода
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY

Величины 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^45" являются эквивалентными.
  • Как строка в формате "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() ).
Тип данных TIME

MySQL извлекает и выводит величины типа TIME в формате "HH:MM:SS" (или в формате "HHH:MM:SS" для больших значений часов). Величины TIME могут изменяться в пределах от "-838:59:59" до "838:59:59". Причина того, что "часовая" часть величины может быть настолько большой, заключается в том, что тип TIME может использоваться не только для представления времени дня (которое должно быть меньше 24 часов), но также для представления общего истекшего времени или временного интервала между двумя событиями (который может быть значительно больше 24 часов или даже отрицательным).

Величины TIME могут быть заданы в различных форматах:

Как строка в формате "D HH:MM:SS.дробная часть" (следует учитывать, что MySQL пока не обеспечивает хранения дробной части величины в столбце рассматриваемого типа). Можно также использовать одно из следующих "облегченных" представлений: HH:MM:SS.дробная часть , HH:MM:SS , HH:MM , D HH:MM:SS , D HH:MM , D HH или SS . Здесь D - это дни из интервала значений 0-33.

  • Как строка без разделителей в формате "HHMMSS", при условии, что строка интерпретируется как дата. Например, величина "101112" понимается как "10:11:12", но величина "109712" будет недопустимой (значение раздела минут является абсурдным) и преобразуется в "00:00:00".
  • Как число в формате HHMMSS , при условии, что строка интерпретируется как дата. Например, величина 101112 понимается как "10:11:12". MySQL понимает и следующие альтернативные форматы: SS
  • Как четырехзначное число в интервале значений от 1901 до 2155.
  • Как двухзначная строка в интервале значений от "00" до "99". Величины в интервалах от "00" до "69" и от "70" до "99" при этом преобразуются в величины YEAR в интервалах от 2000 до 2069 и от 1970 до 1999 соответственно.
  • Как двухзначное число в интервале значений от 1 до 99. Величины в интервалах от 1 до 69 и от 70 до 99 при этом преобразуются в величины YEAR в интервалах от 2001 до 2069 и от 1970 до 1999 соответственно. Необходимо принять во внимание, что интервалы для двухзначных чисел и двухзначных строк несколько различаются, так как нельзя указать "ноль" непосредственно как число и интерпретировать его как 2000. Необходимо задать его как строку "0" или "00", или же оно будет интерпретировано как 0000.
  • Как результат выполнения функции, возвращающей величину, приемлемую в контексте типа данных YEAR (такой как NOW() ).

Недопустимые величины YEAR преобразуются в 0000.

Типы данных date, time и datetime используются для хранения соответственно даты, времени и даты и времени одновременно. Гораздо удобнее хранить дату и время в формате одного из предназначенных для этого типов данных, а не в виде строки символов. Если вы храните дату и время таким образом, то их проще выводить на экран, поскольку SQL Server автоматически придает им привычный формат. Для этих типов данных можно также использовать специальные функции обработки значений типа дата и время.

Если же хранить дату и время как значения типа char, varchar или одного из числовых типов данных, то, естественно, при выводе на экран их формат окажется далеко не тем, к которому мы привыкли.

Следует заметить, что все настройки («по умолчанию») зависят от настроек сервера , поэтому перед внесением каких-либо данных в свою базу следует проверить настройки сервера.

Тип datetime . Позволяет определить для хранения в столбце таблицы дату и время 15.04.00 13:05.

Для отображения значений, хранящихся в виде данных типа datetime, чаще всего (по умолчанию) используется формат: Д ММММ ГГГГ ’г’ (или кратко Д. ММ. ГГ) Ч:мм:сс, например, 12 июня 2000 (или 12.06.00) 22:33:50 . При употреблении значений типа datetime в инструкции INSERT или любой другой их надо ставить в одинарные кавычки. Допускается ввести сначала дату, а потом время, или наоборот, поскольку SQL Server может отличить одно значение от другого и сохранить все так, как нужно.

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

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

Если пропустить часть года, обозначающую век, то декада, меньшая пятидесяти, будет представлена с двадцать первым веком, а декада, большая пятидесяти – с двадцатым. Год необходимо вводить полностью в том случае, если в дате пропущено число. Когда вы вводите дату без числа, это значение будет равно первому числу (по умолчанию).

Время должно вводиться в следующем порядке: часы, минуты, секунды и миллисекунды (если они предусмотрены настройками). Между блоками времени в обязательном порядке должен ставиться разделитель (двоеточие). Он необходим, чтобы распознавать вводимые цифры как время, а не как дату.

В следующей таблице показаны различные интерпретации даты и времени в значении типа datetime.

Цель этой статьи заключается в разъяснении особенностей работы с типами DATETIME в SQL Server, в том числе часто встречающихся заблуждений и общих рекомендаций по их преодолению. Благодаря Frank Kalis эта статья переведена на немецкий язык.

Благодарности:

Я хочу поблагодарить следующих людей за их ценные предложения и материалы для этой статьи: Steve Kass, Aaron Bertrand, Jacco Schalkwijk, Klaus Oberdalhoff, Hugo Kornelis, Dan Guzman и Erland Sommarskog.

Версии SQL Server

Данная статья применима к SQL Server 7.0, 2000, 2005 и 2008, если не указано иначе.

Типы даты и времени в SQL Server

До SQL Server 2008 в SQL Server имелось два типа данных для обработки даты и времени. Поскольку в этой статье мы очень часто будем ссылаться на эти типы, введем сокращенную аббревиатуру для каждого типа в двух представленных ниже таблицах (колонка СК):

Название

Мин. значение

Макс. значение

Точность

Используемая память

smalldatetime sdt 1900-01-01 00:00:00 2079-06-06 23:59:00 минута 4 байта
datetime dt 1753-01-01 00:00:00.000 9999-12-31 23:59:59.997 3.33 мс 8 байт

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

Если задавать только ту часть что касается даты, то SQL Server сохранит время в виде 00:00:00.000.
А если устанавливать значение только времени, SQL Server будет хранить дату как 01.01.1900.
Это очень важно. Прочтите снова.

SELECT CAST(‘20041223’ AS datetime)

———————–
2004-12-23 00:00:00.000

SELECT CAST(’14:23:58′ AS datetime)

———————–
1900-01-01 14:23:58.000

С появлением SQL Server 2008 было получено несколько новых типов данных связанных со значениями даты и времени:

Название

Мин. значение

Макс. значение

Точность

Используемая память

datetime2 dt2 0001-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 100 нс 6-8 байт
date d 0001-01-01 9999-12-31 день 3 байта
time t 00:00:00.0000000 23:59:59.9999999 100 нс 3-5 байта
datetimeoffset dto 0001-01-01 00:00:00.0000000 9999-12-31 23:59:59.9999999 100 нс 8-10 байт
  • Как вы можете видеть, мы наконец-то получили типы данных только для даты (date ) и только для времени (time ).
  • Datetime2 это “лучшее DATETIME” по ряду причин, и занимает не многим больше памяти, чем datetime и потенциально даже меньше!
  • Для нового типа включающего величину времени, вы можете задать “точность до дробных секунд” определяя используемый порядок цифр в секундах после запятой. Так, time(3) может хранить значения наподобие 14:23:12.567, которые при вводе значения 14:23:12:5677 округляются до 14:23:12:568.
  • Новый тип datetimeoffset содержит в себе часть смещения местного часового пояса.

Форматы даты и времени

Распространенное заблуждение – то, что SQL Server хранит эти типы данных в некотором специфическом удобном для чтения формате. Это не так. SQL Server хранит такие значения в своем внутреннем формате (например, два целых числа для datetime и smalldatetime ). При этом, когда используется T-SQL для установки значения (например, в выражении INSERT) вы выражаете его как текстовую строку. Существуют также правила для интерпретации SQL Server-ом различных форматов даты-строки. Но заметим, что в любом случае SQL Server не запомнит этот формат.

Входные форматы для даты и времени

Есть много доступных форматов для приведения значений к виду date/time/datetime. Некоторые из них “лучше”, чем другие, и далее вы поймете почему “лучше”. Примечательно, что все эти форматы применимы для всех типов. Так даже формат “только время” применимо для типа “только дата” и т.д. (В статье игнорируется часть смещения местного часового пояса, которая используется только в типе данных datetimeoffset – более подробно о котором в Books Online.)

Название

Формат

SET DATEFORMAT зависимость

SET LANGUAGE зависимость

Нейтральность к языку

Unseparated u ‘19980223 14:23:05’ нет нет для всех
Separated s ’02/23/1998 14:23:05′ для всех для всех нет
ANSI SQL ansisql ‘1998-12-23 14:23:05’ sdt , dt sdt , dt не для sdt и dt
Alphabetic a ’23 February 1998 14:23:05′ нет для всех (название месяца) нет
ODBC datetime odt {ts ‘1998-02-23 14:23:05’} нет нет для всех
ODBC date od {d ‘1998-02-23’} нет нет для всех
ODBC time ot {t ’14:23:05′} нет нет для всех
ISO 8601 iso ‘1998-02-23T14:23:05’ нет нет для всех
Time t ’14:23:05′
‘2:23:05 PM’
нет нет для всех
  • Отметим, ANSI SQL действительно только частный случай формата с разделительными символами Separated (так называемый “цифровой”), использующий в качестве разделителей тире (-), косую черту (/) и точку (.). Но, поскольку это единственный формат, определенный в стандарте ANSI SQL, по мнению автора это стоит упомянуть как частный случай.
  • Большинство форматов позволяют удалять часть содержащую дату и/или время, и в некоторых случаях это может выглядеть немного … странно. Казалось бы, неразумно указывать, например ‘2008-08-25’ как тип время (time ), но в конечном результате это аналогично не установке значений в строке datetime . Рассмотрим ниже:
    SELECT CAST(AS time)
    SELECT CAST(‘2008-08-25’ AS time)

    Оба запроса выдают один и тот же результат (time 00:00:00).
  • ODBC форматы (ODBC datetime, ODBC date, ODBC time ) отличаются в том смысле, что у них есть маркер (literal_type, t, d или ts), который необходимо правильно задать в зависимости от того, получать ли дату и время, только дату или только время.
  • Для применения формата ISO 8601 необходим сегмент даты и времени.
  • SET DATEFORMAT наследует свои настройки от SET LANGUAGE (но явно заданный SET DATEFORMAT аннулирует более поздний SET LANGUAGE). Языковые настройки по умолчанию задаются для каждого языка используемого при вводе логина. Язык по умолчанию для логина задается при помощи sp_configure.
  • Правила, относительно форматирования части даты и новых типов могут привести к путанице. Microsoft стремится, чтобы дата новых соответствующих типов данных (date, datetime2 и datetimeoffset ) была менее зависима от настроек и еще более соответствовала требованиям ANSI SQL. И в результате – новые типы нейтрально-языковые для выделения составляющих даты-времени до тех пор пока год на первом месте. SQL Server-у необходимо определить, что эта часть является годом, и поэтому требуется 4 позиции составляющих год (yyyy, а не yy). Если это так, то строка будет интерпретироваться как сначала год, затем месяц и, наконец, день – независимо от DATEFORMAT или языковых установок. Если же вначале указывается месяц, тогда DATEFORMAT и языковые настройки будут “соблюдаться”:
    SET LANGUAGE British –uses dmy
    GO
    SELECT CAST(’02-23-1998 14:23:05′ AS date) –Error
    GO
    SELECT CAST(‘2/23/1998 14:23:05’ AS date) –Error
    GO
    SELECT CAST(‘1998-02-23 14:23:05’ AS date) –Ok
    GO
    SELECT CAST(‘1998.02.23 14:23:05’ AS date) –Ok
    GO
    SELECT CAST(‘1998/02/23 14:23:05’ AS date) –Ok
    GO
    Первые
    два запроса ошибочны поскольку год не на первой позиции (и нет 23 месяца в 1998 году). В последующих трех запросах ошибок нет, поскольку требования учтены, и год указан первым (и мы используем один из новых стилей типов связанных с датой). Предельно прозрачно, правда? 🙂

Описание доступных форматов имеется в Books Online, поэтому вдаваться в подробности для каждого формата нет смысла.

Книга Richard T. Snodgrass “Разработка временно-ориентированных приложений баз данных в SQL”: содержит много сведений о представлении время-ориентированной информации в модели данных. И, конечно же, возможно использование этой дополнительной (исторической) информации в своих запросах SQL. Эта книга не издается, а на официальном сайте Ричарда (www.cs.arizona.edu/people/rts), вы бесплатно можете скачать ее в PDF формате.

Перевод: Винчик Евгений

Типы 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 происходит при выполнении любого из следующих условий:

  • Столбец не указан явно в команде INSERT или LOAD DATA INFILE .
  • Столбец не указан явно в команде UPDATE , и при этом изменяется величина в некотором другом столбце (следует отметить, что команда UPDATE , устанавливающая столбец в то же самое значение, которое было до выполнения команды, не вызовет обновления столбца TIMESTAMP , поскольку в целях повышения производительности MySQL игнорирует подобные обновления при установке столбца в его текущее значение).
  • Величина в столбце TIMESTAMP явно установлена в NULL .

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

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

  • Пусть MySQL автоматически установит значение столбца с типом TIMESTAMP при создании данной строки. Столбец будет установлен в исходное состояние со значением текущих даты и времени.
  • При выполнении последующих обновлений других столбцов в данной строке необходимо явно установить столбец TIMESTAMP в его текущее значение.

Однако, с другой стороны, для этих целей, возможно, будет проще использовать столбец DATETIME . При создании строки его следует инициализировать функцией NOW() и оставить в покое при последующих обновлениях.

Величины типа TIMESTAMP могут принимать значения от начала 1970 года до некоторого значения в 2037 году с разрешением в одну секунду. Эти величины выводятся в виде числовых значений.

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

Независимо от размера выводимого значения размер данных, хранящихся в столбцах типа 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^45" являются эквивалентными.
  • Как строка в формате "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 или T IMESTAMP преобразуются в значение ``ноль"" соответствующего типа величин ("0000-00-00 00:00:00" , "0000-00-00" , или 00000000000000).

Для величин, представленных как строки, содержащие разделительные знаки между частями даты, нет необходимости указывать два разряда для значений месяца или дня, меньших, чем 10 . Так, величина "1979-6-9" эквивалентна величине "1979-06-09" . Аналогично, для величин, представленных как строки, содержащие разделительные знаки внутри обозначения времени, нет необходимости указывать два разряда для значений часов, минут или секунд, меньших, чем 10 . Так,

Величины, определенные как числа, должны иметь 6 , 8 , 12 , или 14 десятичных разрядов. Предполагается, что число, имеющее 8 или 14 разрядов, представлено в форматах YYYYMMDD или YYYYMMDDHHMMSS соответственно, причем год указан в первых четырех разрядах. Если же длина числа 6 или 12 разрядов, то предполагаются соответственно форматы YYMMDD или YYMMDDHHMMSS , где год указан в первых двух разрядах. Числа, длина которых не соответствует ни одному из описанных вариантов, интерпретируются как дополненные спереди нулями до ближайшей вышеуказанной длины.

Величины, представленные строками без разделительных знаков, интерпретируются с учетом их длины согласно приведенным далее правилам. Если длина строки равна 8 или 14 символам, то предполагается, что год задан первыми четырьмя символами. В противном случае предполагается, что год задан двумя первыми символами. Строка интерпретируется слева направо, при этом определяются значения для года, месяца, дня, часов, минут и секунд для всех представленных в строке разделов. Это означает, что строка с длиной меньше, чем 6 символов, не может быть использована. Например, если задать строку вида "9903" , полагая, что это будет означать март 1999 года, то MySQL внесет в таблицу ``нулевую"" дату. Год и месяц в данной записи равны 99 и 03 соответственно, но раздел, представляющий день, пропущен (значение равно нулю), поэтому в целом данная величина не является достоверным значением даты.

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

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

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

  • Если присвоить значение типа DATE объекту DATETIME или TIMESTAMP , то в результирующей величине ``временная"" часть будет установлена в "00:00:00" , так как величина DATE не содержит информации о времени.
  • Если присвоить значение типа DATE , DATETIME или TIMESTAMP объекту DATE , то ``временная"" часть в результирующей величине будет удалена, так как тип 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 выполняет только первичную проверку истинности даты: дни 00-31 , месяцы 00-12 , года 1000-9999 . Любая дата вне этого диапазона преобразуется в 0000-00-00 . Следует отметить, что, тем не менее, при этом не запрещается хранить неверные даты, такие как 2002-04-31 . Это позволяет веб-приложениям сохранять данные форм без дополнительной проверки. Чтобы убедиться в достоверности даты, выполняется проверка в самом приложении.
  • Величины года, представленные двумя разрядами, допускают неоднозначное толкование, так как неизвестно столетие. MySQL интерпретирует двухразрядные величины года по следующим правилам:
    • Величины года в интервале 00-69 преобразуются в 2000-2069 .
    • Величины года в интервале 70-99 преобразуются в 1970-1999 .


© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows