English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Уровень базовый учебник SQL

SQL соединение (Join)

Уровень продвинутый учебник SQL

Референтное руководство SQL

Даты и время SQL

В этом руководстве вы узнаете, как использовать даты и время в SQL.

Обработка даты и времени

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

Такой тип данных называется временными данными, и каждый движок базы данных имеет для них стандартный формат хранения и тип данных. В таблице ниже показаны типы данных, поддерживаемые сервером базы данных MySQL для обработки данных даты и времени.

ТипПредустановленный форматДопустимые значения
DATEYYYY-MM-DD1000-01-01 - 9999-12-31
ВРЕМЯHH:MM:SS или HHH:MM:SS-838:59:59 - 838:59:59
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 - 9999-12-31 23:59:59
ТИМESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 - 2037-12-31 23:59:59
ГОДYYYY1901 - 2155

Формат значения DATE - YYYY-MM-DD, где YYYY представляет собой полный год (четыре цифры), а MM и DD соответственно представляют собой месяц и день месяца (числа с двумя нулями перед ними). Значение времени обычно принимается в формате HH:MM:SS, где HH, MM, SS соответственно представляют собой часы, минуты и секунды.

Следующие инструкции демонстрируют, как вставлять значения даты в таблицу базы данных:

INSERT INTO employees (emp_name, hire_date, salary)
VALUES ('Adam Smith', '2015-06-24', 4500);

Внимание:В MySQL часовая часть значения времени может быть больше, так как MySQL рассматривает их как время выполнения. Это означает, что тип данных время может использоваться не только для представления времени дня (должно быть меньше 24 часов), но и для представления интервала между двумя событиями, который может быть больше 24 часов, даже отрицательным.

Трекинг времени создания или изменения строки

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

В MySQL вы можете использовать функцию NOW() для вставки текущей временной метки, как показано ниже:

-- Грамматика MySQL базы данных
INSERT INTO users (name, birth_date, created_at)
VALUES ('Bilbo Baggins', '1998-04-16', NOW());

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

Чтобы назначить автоматические атрибуты, укажите предложения DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP в определении столбца, как показано ниже:

-- Грамматика MySQL базы данных
CREATE TABLE users (
    id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL UNIQUE,
    birth_date DATE NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Внимание:Автоматическая инициализация и обновление типа данных DATETIME доступна только в MySQL 5.6.5 или более поздних версиях. Если вы используете старую версию, пожалуйста, используйте TIMESTAMP.

Извлечение части даты или времени

В некоторых случаях вы хотите получить только часть даты или времени. В MySQL вы можете использовать функции,专门 предназначенные для извлечения частей временных значений, такие как YEAR(), MONTH(), DAYOFMONTH(), MONTHNAME(), DAYNAME(), HOUR(), MINUTE(), SECOND() и т.д.

Следующие SQL-запросы извлекут годовую часть значения столбца birth_date, например, если дата рождения любого пользователя равна 1987-01-14, то YEAR(birth_date) вернет 1987.

mysql> SELECT name, YEAR(birth_date) FROM users;

Таким образом, вы можете использовать функцию DAYOFMONTH() для получения определенного дня месяца, например, если дата рождения любого пользователя birth_date равна 1986-10-06, то DAYOFMONTH(birth_date) вернет 6.

mysql> SELECT name, DAYOFMONTH(birth_date) FROM users;

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

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

Ниже приведен SQL-запрос, установленный в более читаемый форматusersв таблицеbirth_dateФормат значений столбца, например, от 14 января 1987 года до 14 января 1987 года.

mysql> SELECT name, DATE_FORMAT(birth_date, '%M %e, %Y') FROM users;