MySQL 6

Типовете DATETIME, DATE и TIMESTAMP са свързани типове данни. Този раздел описва техните свойства, общи характеристики и разлики.

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

Типът ДАТА се използва за стойности само с информация за дата, без времева част. MySQL извлича и извежда стойности на ДАТА във формат 'ГГГГ-ММ-ДД'. Поддържаните стойности варират от '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 с по-къси изходни низове:

Тип колонаИзходен формат
ЧАСОВ КЛАП (14)ГГГГММДДЧЧММСС
ЧАСОВ КЛАП (12)ГГММДДЧЧММСС
ЧАСОВ КЛАП (10)ГГММДДЧЧММ
ЧАСОВ КЛАП (8)ГГГГММДД
ЧАСОВ КЛАП (6)ГГММДД
ЧАСОВ КЛАП (4)ГГММ
ЧАСОВ КЛАП (2)YY

Независимо от размера на изходната стойност, размерът на данните, съхранявани в колоните TIMESTAMP, винаги е един и същ. Най-често използваният изходен формат е 6, 8, 12 или 14 знака след десетичната запетая. Когато създавате таблица, можете да зададете произволен размер за изходните стойности, но ако този размер е зададен на 0 или по-голям от 14, тогава ще се използва стойността 14. Нечетните стойности на размера в диапазона от 1 до 13 ще бъдат намалени до най-близкото по-високо четно число.

Стойностите DATETIME, DATE и TIMESTAMP могат да бъдат посочени във всеки от следните стандартни формати:

Като низ във формат „ГГГГ-ММ-ДД ЧЧ:ММ:СС“ или във формат „ГГ-ММ-ДД ЧЧ:ММ:СС“. Позволен е ``олекотен'' синтаксис - всеки препинателен знак може да се използва като разделител между части от секциите за дата или час. Например стойностите '98-12-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45' и '98@12@31 11^30^45' са еквивалентни.

Като низ във формат „ГГГГ-ММ-ДД“ или във формат „ГГ-ММ-ДД“. Синтаксисът „лек“ също е разрешен тук. Например стойностите '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 ' .

какниз без разделители във формат „ГГГГММДД“ или във формат „ГГММДД“, при условие че низът се интерпретира като дата. Например стойностите '19970523' и '970523' могат да се интерпретират като '1997-05-23', но стойността '971332' е невалидна (стойностите за секциите за месец и ден са безсмислени) и се преобразува в '0000-00-00'.

Като число във формат YYYYMMDDHHMMSS или формат YYMMDDHHMMSS, при условие че числото се интерпретира като дата. Например стойностите 19830905132800 и 830905132800 се интерпретират като '1983-09-05 13:28:00'.

Като число във формат ГГГГММДД или във формат ГГММДД, при условие че числото се тълкува като дата. Например стойностите 19830905 и 830905 се интерпретират като '1983-09-05'.

В резултат на изпълнение на функция, която връща стойност, приемлива в контекста на типа данни DATETIME, DATE или TIMESTAMP (например функциите NOW() или CURRENT_DATE().

Невалидни стойности DATETIME, DATE или TIMESTAMP се преобразуват в стойността ``null'' на съответния тип стойност ('0000-00-00 00:00:00', '0000-00-00' или 000000000000000).

За стойности, представени като низове, съдържащи разделители между частите от датата, не е необходимо да се указват две цифри за стойности за месец или ден, по-малки от 10. Така стойността '1979-6-9' е еквивалентна на стойността '1979-06-09'. По същия начин, за стойности, представени като низове, съдържащи разделители в нотацията за време, не е необходимо да се указват две цифри за стойности за час, минута или секунда, по-малки от 10. Така,

Стойностите, посочени като числа, трябва да имат 6, 8, 12 или 14 знака след десетичната запетая. Приема се, че число с 8 или 14 цифри е представено съответно във формат ГГГГММДД или ГГГГММДДЧЧММСС с годинатапосочени в първите четири цифри. Ако дължината на числото е 6 или 12 цифри, тогава се приемат съответно форматите ГГММДД или ГГММДДЧЧММСС, където годината е посочена в първите две цифри. Числата, чиято дължина не съответства на никоя от описаните опции, се интерпретират като водещи с нулева подплата до най-близката дължина, посочена по-горе.

Валидни стойности се съхраняват в колони 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.