|
Программирование >> Программный интерфейс приложений
в соответствии со спецификацией ANSI, даты представлены в формате год-месяц-день . Например, дата 3 декабря 1999 года представляется в формате 1999-12-03 . СУБД MySQL позволяет некоторые послабления при вводе дат. Так, она автоматически преобразует представление года двумя цифрами в представление года четырьмя цифрами, допускается также ввод чисел и месяцев меньше 10 без ведущего нуля. Однако сначала нужно указать год. Форматы, которые используются чаще, могут интерпретироваться неверно. Правила интерпретации дат в СУБД MySQL обсуждаются подробнее в разделе Работа со столбцами календарного типа , дальше в этой главе. Временные значения возвращаются в местном времени, установленном на сервере СУБД MySQL. Адаптации к местному времени не производится. Типы DATE, TIME и DATETIME Столбцы типа DATE, TIME, DATETIME используются ДЛЯ Хранения дат, времени, дат и времени одновременно. Их форматы YYYY-MM-DD , hh:mm:ss И YYYY-MM-DD hh:mm:ss соответственно. В столбцах типа DATETIME требуется указание как части с датой, так и части, в которой указывается время. При присвоении столбцу типа DATETIME значения из столбца DATE временной части будет добавлено значение 00:00:00 . СУБД MySQL обрабатывает временные данные типа DATETIME, TIME, по-разному. В столбцах типа DATETIME СУБД MySQL хранит информацию о времени в формате времени суток. В столбцах типа TIME - как прошедшее время (вот почему диапазон значений для этого типа так велик и допускаются отрицательные значения). Правая часть значений отображает секунды, таким образом, при добавлении короткого (неполного) значения времени, такого как 12:30 , в столбце типа TIME, получим 00:12:30 , т.е. 12 минут, 30 секунд . При желании можно хранить данные в этом формате, но об этом нюансе следует помнить (т.е. для хранения времени 12 часов, 30 минут его необходимо вводить как 12:30:00 ). Тип TIMESTAMP Столбцы типа tiMESTAMP предназначены для хранения в формате YYYYMMDDhhmmss , даты, начиная с 19700101000000, до неопределнной даты в 2037 году. Этот диапазон привязан к таймеру ОС UNIX, в котором отсчет начинается с первого дня 1970 года, который является нулевым днем или началом эпохи для ОС UNIX. Начало 1970 года опеределяет начало диапазона значений, принимаемых данными типа TIMESTAMP. Верхнее значение диапазона соответствует четырехбайтовому предельному значению, которое может содержать значения, отражающие дату где-то в 2037 году *. * Верхнее значение диапазона типа данных timestamp возрастает по мере роста верхнего предела диапазона временных значений в ОС UNIX. Это все сделано на уровне системных библиотек. СУБД MySQL сразу же воспользуется нововведениями. Столбец типа timestamp (временная отметка) имеет такое название потому, что он записывается в момент создания или модификации записи. При вводе пустого значения в столбец timestamp он автоматически получит значение текущей даты и времени. Это же происходит при создании или модификации строки, но без присвоения какого-либо явного значения данному столбцу. Однако подобным образом будут обрабатываться данные только первого столбца данного типа, но даже в первом столбце можно подавить присвоение текущего времени. Для этого необходимо присвоить явное значение. В объявлении столбца timestamp можно определить максимальную длину выводимого значения М. Допустимые форматы отображения представлены в табл. 2.12. Если Мв объявлении отсутствует, равно О или больще 14, столбцу будет присвоено значение timestamp (14). Все нечетные значения М, лежащие в диапазоне от 1 до 13, будут приведены к ближайшему большему четному числу. Таблица 2.12. Форматы отображения типа timestamp
Формат отображения столбцов типа timestamp не имеет ничего общего с объемом памяти, который требуется для запоминания, и внутренним представлением значений. Значения этого типа данных хранятся в 4 байтах. Для того чтобы это продемонстрировать, создадим следующую таблицу, затем добавим несколько строк и выберем их: CREATE TABLE my table ( ts TIMESTAMP(8), I INT INSERT INTO my table VALUES(19990801120000,3) INSERT INTO my table VALUES{19990801120001,2) INSERT INTO my table VALUES(19990801120002,1) INSERT INTO my table VALUES(19990801120003,0) SELECT * FROM my table ORDER BY ts, a Этот запрос возвратит результат. +----------i------+ I ts 111 +----------+-----+ 1 19990801 I 3 I I 19990801 1 2 I ( 19990801 i 1 i I 19990801 I 0 i По полученному результату видно, что строки отсортированы в неверном порядке - значения первого столбца одинаковы, и может показаться, что строки отсортированы в соответствии с порядком следования столбцов второго столбца. Этот абсолютно ненормальный результат получен благодаря тому, что сортировка значений типа timestamp в СУБД MySQL делается по полному значению, состоящему из J 4 цифр. СУБД MySQL не имеет типа столбца, который может принимать значение текущей даты и текущего времени в момент создания записи. Это можно сделать двумя способами. В столбце типа timestamp. При создании записи для инициализации текущей даты и времени присвойте столбцу пустое значение. INSERT INTO tbl name {ts col,..)( VALUES (NULL,...) Если необходимо модифицировать запись, присвойте явным образом столбцу значение, которое он уже имеет. Это подавит механизм автоматического присвоения текущей даты и времени и предотвратит автоматическую модификацию столбца. UPDATE tbl name SET ts col = ts col WHERE... В столбце типа datetime. При создании записи для инициализации текущей даты и времени присвойте столбцу значение now (). INSERT INTO tbl name (dt col,. ) (VALUES (NOW(), .) При необходимости модификации записи в дальнейшем не трогайте эти столбцы. UPDATE tbl nanie SET /* здесь можно задавать все, кроме столбца dt col / WHERE . При необходимости можно использовать столбцы timestamp как для хранения даты создания, так и для хранения даты последней модификации. Для этого необходимо создать два столбца: один типа timestamp для хранения времени создания записи, а другой - аналогичного типа для хранения времени модификации записи. При этом столбец, хранящий дату модификации записи, должен быть первым в таблице, а столбец, хранящий дату создания записи, - вторым. Первый столбец будет принимать значение текущей даты всякий раз, когда запись создается или изменяется, а второму будет присваиваться значение now () в момент создания записи. Таким образом, можно ввести данные по добавлению записей в таблицы, которые не будут изменяться при внесении изменений в таблицу.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |