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

Улучшите свои навыки программирования с помощью временных значений в MySQL.


Этот обзор значений даты и времени в MySQL поможет вам воспользоваться временными значениями в таблицах вашей базы данных.

Как новые, так и опытные пользователи популярной системы баз данных MySQL часто могут запутаться в том, как база данных обрабатывает временные значения. Иногда пользователи не утруждают себя изучением типов данных временных значений. Это может быть потому, что они думают, что о них мало что можно знать. Свидание есть свидание, верно? Ну, не всегда. Будет полезно потратить несколько минут на изучение того, как MySQL хранит и отображает дату и время. Изучение того, как наилучшим образом использовать временные значения в таблицах базы данных, поможет вам стать лучшим программистом.

Временные типы данных MySQL

Когда вы создаете свои таблицы в MySQL, вы выбираете правильный тип данных, который наиболее эффективно хранит данные, которые вы собираетесь вставить в таблицу (INT, FLOAT, CHAR и т. д.). MySQL предоставляет вам пять типов данных для временных значений. Это: DATE, TIME, DATETIME, TIMESTAMP и YEAR.

MySQL использует формат ISO 8601 для хранения значений в следующих форматах:

  • ДАТА  ГГГГ-ММ-ДД
  • ВРЕМЯ   ЧЧ:ММ:СС
  • TIMESTAMP ГГГГ-ММ-ДД  ЧЧ:ММ:СС
  • ГОД ГГГГ

Дата и время по сравнению с меткой времени

Возможно, вы заметили, что типы данных DATETIME и TIMESTAMP содержат одни и те же данные. Вы можете задаться вопросом, есть ли между ними какие-либо различия. Есть различия.

Во-первых, диапазон дат, которые можно использовать, различается. DATETIME может содержать даты в диапазоне от 1000-01-01 00:00:00 до 9999-12-31 23:59:59, тогда как TIMESTAMP имеет гораздо более ограниченный диапазон значений. С 1970-01-01 00:00:01 по 2038-01-19 03:14:07 UTC.

Во-вторых, хотя оба типа данных позволяют вам auto_initialize или auto_update их соответствующие значения (с DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP > соответственно), это было недоступно для значений DATETIME до версии 5.6.5. Вы можете использовать один из синонимов MySQL для CURRENT_TIMESTAMP, если хотите, например, NOW() или LOCALTIME().

[ Загрузить сейчас: шпаргалка по MariaDB и MySQL ]

Если вы используете ON UPDATE CURENT_TIMESTAMP (или один из его синонимов) для значения DATETIME, но не используете предложение DEFAULT CURRENT_TIMESTAMP, то столбец по умолчанию будет иметь значение NULL. Это произойдет, если вы не включите NOT NULL в определение таблицы, и в этом случае он по умолчанию равен нулю.

Еще одна важная вещь, о которой следует помнить: хотя обычно ни столбец DATETIME, ни столбец TIMESTAMP не имеют значения по умолчанию, если вы его не объявили, из этого правила есть одно исключение. Первый столбец TIMESTAMP в вашей таблице неявно создается с помощью предложений DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP, если ни одно из них не указано и если переменная >explicit_defaults_for_timestamp отключен.

Чтобы проверить статус этой переменной, запустите:

mysql> show variables like 'explicit_default%';

Если вы хотите включить или выключить его, запустите этот код, используя 0 для выключения и 1 для включения:

mysql> set explicit_defaults_for_timestamp = 0;

Время

Тип данных MySQL TIME может показаться достаточно простым, но есть несколько вещей, о которых должен помнить хороший программист.

Во-первых, имейте в виду, что хотя время часто воспринимается как время суток, на самом деле это прошедшее время. Другими словами, оно может быть отрицательным значением или превышать 23:59:59. Значение TIME в MySQL может находиться в диапазоне от -838:59:59 до 838:59:59.

Кроме того, если вы сокращаете значение времени, MySQL интерпретирует его по-разному в зависимости от того, используете ли вы двоеточие. Например, значение 10:34 воспринимается MySQL как 10:34:00. То есть 34 минуты десятого. Но если вы опустите двоеточие 1034', MySQL увидит это как 00:10:34. То есть десять минут и 34 секунды.

Наконец, вы должны знать, что значения TIME (а также временная часть столбцов DATETIME и TIMESTAMP) могут, начиная с версии 5.6.4, , возьмем дробную единицу. Чтобы использовать его, добавьте целое число (максимальное значение шесть) в скобках в конце определения типа данных.

time_column TIME(2)

Часовые пояса

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

Вопрос в том, как обращаться с пользователями системы баз данных, находящимися в разных часовых поясах. К счастью, MySQL не усложняет эту задачу.

Чтобы проверить часовой пояс сеанса, запустите:

mysql> select @@session.time_zone;

Если там указано System, это означает, что используется часовой пояс, установленный в вашем файле конфигурации my.cnf . Если вы используете сервер MsSQL на своем локальном компьютере, вы, вероятно, получите именно это, и вам не нужно вносить какие-либо изменения.

Если вы хотите изменить часовой пояс вашего сеанса, выполните такую команду, как:

mysql> set time_zone = '-05:00';

Это установит ваш часовой пояс на пять часов позже UTC. (США/Восточная Европа).

Получение дня недели

Чтобы следовать коду в оставшейся части этого руководства, вам следует создать таблицу со значениями дат в вашей системе. Например:

mysql> create table test
( row_id smallint not null auto_increment primary key,
the_date date not null);

Затем вставьте в таблицу несколько случайных дат, используя формат ISO 8601, например:

mysql> insert into test (the_date) VALUES ('2022-01-05');

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

Иногда вам может понадобиться узнать, в какой день недели выпал тот или иной день. MySQL предоставляет вам несколько вариантов.

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

mysql> SELECT the_date, DAYNAME(the_date) FROM test ;
+------------+-------------------------------+
| the_date   | DAYNAME(the_date)             |
+------------+-------------------------------+
| 2021-11-02 | Tuesday                       |
| 2022-01-05 | Wednesday                     |
| 2022-05-03 | Tuesday                       |
| 2023-01-13 | Friday                        |
+------------+-------------------------------+
4 rows in set (0.00 sec)

Два других метода получения дня недели возвращают целочисленные значения вместо названия дня. Это ДЕНЬНЕД() и ДЕНЬНЕДЕЛИ(). Оба они возвращают числа, но не одно и то же число. Функция WEEKDAY() возвращает число от 0 до 6, где 0 — понедельник, а 6 — воскресенье. С другой стороны, DAYOFWEEK() возвращает число от 1 до 7, где 1 — воскресенье, а 7 — суббота.

mysql> SELECT the_date, DAYNAME(the_date),
WEEKDAY(the_date), DAYOFWEEK(the_date) FROM test;
+------------+------------------+------------------+--------------------+
| the_date   | DAYNAME(the_date)| WEEKDAY(the_date)| DAYOFWEEK(the_date)|
| 2021-11-02 | Tuesday          | 1                | 3                  |
| 2022-01-05 | Wednesday        | 2                | 4                  |
| 2022-05-03 | Tuesday          | 1                | 3                  |
| 2023-01-13 | Friday           | 4                | 6                  |
+------------+------------------+------------------+--------------------+
4 rows in set (0.00 sec)

Когда тебе нужна только часть свидания

Иногда у вас может быть дата, хранящаяся в вашей таблице MySQL, но вы хотите получить доступ только к части даты. Это не проблема.

В MySQL есть несколько функций с удобными именами, которые обеспечивают легкий доступ к определенной части объекта даты. Покажем лишь несколько примеров:

mysql> SELECT the_date, YEAR(the_date), MONTHNAME(the_date), 
DAYOFMONTH(the_date) FROM test ;
+-----------+---------------+-------------------+---------------------+
| the_date  | YEAR(the_date)|MONTHNAME(the_date)| DAYOFMONTH(the_date)|
+-----------+---------------+-------------------+---------------------+
| 2021-11-02| 2021          | November          | 2                   |
| 2022-01-05| 2022          | January           | 5                   |
| 2022-05-03| 2022          | May               | 3                   |
| 2023-01-13| 2023          | January           | 13                  |
+-----------+---------------+-------------------+---------------------+
4 rows in set (0.00 sec)

MySQL также позволяет вам использовать функцию EXTRACT() для доступа к части даты. Аргументы, которые вы передаете функции, — это спецификатор единицы измерения (убедитесь, что он в единственном числе), FROM и имя столбца. Итак, чтобы получить только год из нашей тестовой таблицы, вы можете написать:

mysql> SELECT EXTRACT(YEAR FROM the_date) FROM test;
+----------------------------------------------+
| EXTRACT(YEAR FROM the_date)                  |
+----------------------------------------------+
| 2021                                         |
| 2022                                         |
| 2022                                         |
| 2023                                         |
+----------------------------------------------+
4 rows in set (0.01 sec)

Вставка и чтение дат в разных форматах

Как упоминалось ранее, MySQL хранит значения даты и времени, используя формат ISO 8601. Но что, если вы хотите хранить значения даты и времени другим способом, например, в формате ММ-ДД-ГГГГ для дат? Ну, во-первых, не пытайтесь. MySQL хранит дату и время в формате 8601, и так оно и есть. Не пытайтесь это изменить. Однако это не означает, что вам нужно конвертировать данные в этот конкретный формат, прежде чем вводить их в базу данных, или что вы не можете отображать данные в любом желаемом формате.

Если вы хотите ввести дату в таблицу, отформатированную не по стандарту ISO, вы можете использовать STR_TO_DATE(). Первый аргумент — это строковое значение даты, которую вы хотите сохранить в своей базе данных. Второй аргумент — это строка форматирования, которая позволяет MySQL узнать, как организована дата. Давайте рассмотрим небольшой пример, а затем я углублюсь в то, что представляет собой эта странная строка форматирования.

mysql> insert into test (the_date) values (str_to_date('January 13, 2023','%M %d, %Y'));

Query OK, 1 row affected (0.00 sec)

Вы помещаете строку форматирования в кавычки и ставите перед каждым специальным символом знак процента. Последовательность форматов в приведенном выше коде сообщает MySQL, что моя дата состоит из полного названия месяца (%M), за которым следует двухзначный день (%d), а затем запятая и, наконец, четырехзначный год (%Y). Обратите внимание, что капитализация имеет значение.

Некоторые из других часто используемых символов строки форматирования:

  • %b сокращенное название месяца (пример: январь)
  • %c числовой месяц (пример: 1)
  • %W название дня (пример: суббота)
  • %a сокращенное название дня (пример: суббота)
  • %T 24-часовое время (пример: 22:01:22)
  • %r 12-часовое время с AM/PM (пример: 22:01:22)
  • %y Год из двух цифр (пример: 23)

Обратите внимание, что для двухзначного года (%y) диапазон лет составляет от 1970 до 2069. Таким образом, числа от 70 до 99 считаются 20-м веком, а числа от 00 до 69 — 21-м веком. век.

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

mysql> SELECT DATE_FORMAT(the_date, '%W, %b. %d, %y') FROM test;
+-----------------------------------------+
| DATE_FORMAT(the_date, '%W, %b. %d, %y') |
+-----------------------------------------+
| Tuesday, Nov. 02, 21                    |
| Wednesday, Jan. 05, 22                  |
| Tuesday, May. 03, 22                    |
| Friday, Jan. 13, 23                     |
+-----------------------------------------+
4 rows in set (0.00 sec)

Заключение

Это руководство должно дать вам полезный обзор значений даты и времени в MySQL. Я надеюсь, что эта статья научила вас чему-то новому, что позволит вам лучше контролировать и лучше понимать, как ваша база данных MySQL обрабатывает временные значения.