> For the complete documentation index, see [llms.txt](https://olexsyn.gitbook.io/enote/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://olexsyn.gitbook.io/enote/data/mysql/functions/funkcii-dlya-raboty-s-datami-i-vremenem.md).

# Функции для работы с датами и временем

<https://metanit.com/sql/mysql/6.3.php>

### Формат даты и времени <a href="#header-10291-1" id="header-10291-1"></a>

MySQL date format поддерживает несколько форматов даты и времени. Их можно определить следующим образом:

DATE - хранит значение даты в виде ГГГГ-ММ-ДД. Например, 2008-10-23.\
DATETIME - хранит значение даты и времени в виде ГГГГ-MM-ДД ЧЧ:ММ:СС. Например, 2008-10-23 10:37:22. Поддерживаемый диапазон дат и времени: 1000-01-01 00:00:00 до 9999-12-31 23:59:59\
TIMESTAMP - похож на DATETIME с некоторыми различиями в зависимости от версии MySQL и режима, в котором работает сервер.

### Создание полей даты и времени <a href="#header-10291-2" id="header-10291-2"></a>

Таблица, содержащая типы данных DATE и DATETIME, создается так же, как и другие столбцы. Например, мы можем создать новую таблицу под названием orders, которая содержит столбцы номера заказа, заказанного товара, даты заказа и даты доставки заказа:

```
CREATE TABLE `MySampleDB`.`orders` (
  `order_no` INT  NOT NULL AUTO_INCREMENT,
  `order_item` TEXT  NOT NULL,
  `order_date` DATETIME  NOT NULL,
  `order_delivery` DATE  NOT NULL,
  PRIMARY KEY (`order_no`)
)
ENGINE = InnoDB;
```

Столбец ORDER\_DATE - это поле типа MySQL DATE TIME, в которое мы записываем дату и время, когда был сделан заказ. Для даты доставки невозможно предсказать точное время, поэтому мы записываем только дату.

### Форматы даты и времени <a href="#header-10291-3" id="header-10291-3"></a>

Наиболее часто используемым разделителем для дат является тире (-), а для времени - двоеточие (:). Но мы можем использовать любой символ, или вообще не добавлять никакого символа.

Например, все следующие форматы являются правильными:

```
2008-10-23 10:37:22
20081023103722
2008/10/23 10.37.22
2008*10*23*10*37*22
```

### Функции даты и времени <a href="#header-10291-4" id="header-10291-4"></a>

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

<table data-header-hidden><thead><tr><th width="205"></th><th></th></tr></thead><tbody><tr><td>Функция</td><td>Описание</td></tr><tr><td>ADDDATE()</td><td>Добавляет дату.</td></tr><tr><td>ADDTIME()</td><td>Добавляет время.</td></tr><tr><td>CONVERT_TZ()</td><td>Конвертирует из одного часового пояса в другой.</td></tr><tr><td>CURDATE()</td><td>Возвращает текущую дату.</td></tr><tr><td>CURTIME()</td><td>Возвращает текущее системное время.</td></tr><tr><td>DATE_ADD()</td><td>Добавляет одну дату к другой.</td></tr><tr><td>DATE_FORMAT()</td><td>Задает указанный формат даты.</td></tr><tr><td>DATE()</td><td>Извлекает часть даты из даты или выражения дата-время.</td></tr><tr><td>DATEDIFF()</td><td>Вычитает одну дату из другой.</td></tr><tr><td>DAYNAME()</td><td>Возвращает день недели.</td></tr><tr><td>DAYOFMONTH()</td><td>Возвращает день месяца (1-31).</td></tr><tr><td>DAYOFWEEK()</td><td>Возвращает индекс дня недели из аргумента.</td></tr><tr><td>DAYOFYEAR()</td><td>Возвращает день года (1-366).</td></tr><tr><td>EXTRACT()</td><td>Извлекает часть даты.</td></tr><tr><td>FROM_DAYS()</td><td>Преобразует номер дня в дату.</td></tr><tr><td>FROM_UNIXTIME()</td><td>Задает формат даты в формате UNIX.</td></tr><tr><td>DATE_SUB()</td><td>Вычитает одну дату из другой.</td></tr><tr><td>HOUR()</td><td>Извлекает час.</td></tr><tr><td>LAST_DAY()</td><td>Возвращает последний день месяца для аргумента.</td></tr><tr><td>MAKEDATE()</td><td>Создает дату из года и дня года.</td></tr><tr><td>MAKETIME()</td><td>Возвращает значение времени.</td></tr><tr><td>MICROSECOND()</td><td>Возвращает миллисекунды из аргумента.</td></tr><tr><td>MINUTE()</td><td>Возвращает минуты из аргумента.</td></tr><tr><td>MONTH()</td><td>Возвращает месяц из переданной даты.</td></tr><tr><td>MONTHNAME()</td><td>Возвращает название месяца.</td></tr><tr><td>NOW()</td><td>Возвращает текущую дату и время.</td></tr><tr><td>PERIOD_ADD()</td><td>Добавляет интервал к месяцу-году.</td></tr><tr><td>PERIOD_DIFF()</td><td>Возвращает количество месяцев между двумя периодами.</td></tr><tr><td>QUARTER()</td><td>Возвращает четверть часа из переданной даты в качестве аргумента.</td></tr><tr><td>SEC_TO_TIME()</td><td>Конвертирует секунды в формат 'ЧЧ:MM:СС'.</td></tr><tr><td>SECOND()</td><td>Возвращает секунду (0-59).</td></tr><tr><td>STR_TO_DATE()</td><td>Преобразует строку в дату.</td></tr><tr><td>SUBTIME()</td><td>Вычитает время.</td></tr><tr><td>SYSDATE()</td><td>Возвращает время, в которое была выполнена функция.</td></tr><tr><td>TIME_FORMAT()</td><td>Задает формат времени.</td></tr><tr><td>TIME_TO_SEC()</td><td>Возвращает аргумент, преобразованный в секунды.</td></tr><tr><td>TIME()</td><td>Выбирает часть времени из выражения, передаваемого в качестве аргумента.</td></tr><tr><td>TIMEDIFF()</td><td>Вычитает время.</td></tr><tr><td>TIMESTAMP()</td><td>С одним аргументом эта функция возвращает дату или выражение дата-время. С двумя аргументами возвращается сумма аргументов.</td></tr><tr><td>TIMESTAMPADD()</td><td>Добавляет интервал к дате-времени.</td></tr><tr><td>TIMESTAMPDIFF()</td><td>Вычитает интервал из даты - времени.</td></tr><tr><td>TO_DAYS()</td><td>Возвращает аргумент даты, преобразованный в дни.</td></tr><tr><td>UNIX_TIMESTAMP()</td><td>Извлекает дату-время в формате UNIX в формат, принимаемый MySQL.</td></tr><tr><td>UTC_DATE()</td><td>Возвращает текущую дату по универсальному времени (UTC).</td></tr><tr><td>UTC_TIME()</td><td>Возвращает текущее время по универсальному времени (UTC).</td></tr><tr><td>UTC_TIMESTAMP()</td><td>Возвращает текущую дату-время по универсальному времени (UTC).</td></tr><tr><td>WEEK()</td><td>Возвращает номер недели.</td></tr><tr><td>WEEKDAY()</td><td>Возвращает индекс дня недели.</td></tr><tr><td>WEEKOFYEAR()</td><td>Возвращает календарную неделю даты (1-53).</td></tr><tr><td>YEAR()</td><td>Возвращает год.</td></tr><tr><td>YEARWEEK()</td><td>Возвращает год и неделю.</td></tr></tbody></table>

Вы можете поэкспериментировать с этими функциями MySQL date format, даже не занося никаких данных в таблицу. Например:

```
mysql> SELECT NOW();

+---------------------+
| NOW()               |
+---------------------+
| 2007-10-23 11:46:31 |
+---------------------+
1 row in set (0.00 sec)
```

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

```
mysql> SELECT MONTHNAME(NOW());

+------------------+
| MONTHNAME(NOW()) |
+------------------+
| October |
+------------------+
1 row in set (0.00 sec)
```

### Внесение значений даты и времени в столбцы таблицы <a href="#header-10291-5" id="header-10291-5"></a>

Рассмотрим, как вносятся значения date MySQL в таблицу. Чтобы продемонстрировать это, мы продолжим использовать таблицу orders, которую создали в начале статьи.

Мы начнем с добавления новой строки заказа. Значение поля order\_no будет автоматически увеличиваться на 1, так что нам остается вставить значения order\_item, дату создания заказа и дату доставки. Дата заказа - это время, в которое вставляется заказ, поэтому мы можем использовать функцию NOW(), чтобы внести в строку текущую дату и время.

Дата доставки - это период времени после даты заказа, которую мы можем вернуть, используя функцию MySQL DATE ADD(), которая принимает в качестве аргументов дату начала (в нашем случае NOW ()) и INTERVAL (в нашем случае 14 дней). Например:

```
INSERT INTO orders (order_item, order_date, order_delivery) 
VALUES ('iPhone 8Gb', NOW(), DATE_ADD(NOW(), INTERVAL 14 DAY));
```

Данный запрос создает заказ для указанного элемента с датой, временем выполнения заказа, и интервалом через две недели после этого в качестве даты доставки:

```
mysql> SELECT * FROM orders;
+----------+------------+---------------------+----------------+
| order_no | order_item | order_date          | order_delivery |
+----------+------------+---------------------+----------------+
|        1 | iPhone 8Gb | 2007-10-23 11:37:55 | 2007-11-06     |
+----------+------------+---------------------+----------------+
1 row in set (0.00 sec)
```

Точно так же можно заказать товар с датой доставки через два месяца:

```
mysql> INSERT INTO orders (order_item, order_date, order_delivery) VALUES ('ipod Touch 4Gb', NOW(), DATE_ADD(NOW(), INTERVAL 2 MONTH));

Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM orders;
+----------+----------------+---------------------+----------------+
| order_no | order_item     | order_date          | order_delivery |
+----------+----------------+---------------------+----------------+
|        1 | iPhone 8Gb     | 2007-10-23 11:37:55 | 2007-11-06     |
|        2 | ipod Touch 4Gb | 2007-10-23 11:51:09 | 2007-12-23     |
+----------+----------------+---------------------+----------------+
2 rows in set (0.00 sec)
```

### Извлечение данных по дате и времени <a href="#header-10291-6" id="header-10291-6"></a>

В MySQL мы можем отфильтровать извлеченные данные в зависимости от даты и времени. Например, мы можем извлечь только те заказы, доставка которых запланирована на ноябрь:

```
mysql> SELECT * FROM orders WHERE MONTHNAME(order_delivery) = 'November';
+----------+------------+---------------------+----------------+
| order_no | order_item | order_date          | order_delivery |
+----------+------------+---------------------+----------------+
|        1 | iPhone 8Gb | 2007-10-23 11:37:55 | 2007-11-06     |
+----------+------------+---------------------+----------------+
1 row in set (0.00 sec)
```

Точно так же мы можем использовать BETWEEN, чтобы выбрать товары, доставка которых произойдет между двумя указанными датами. Например:

```
mysql> SELECT * FROM orders WHERE order_delivery BETWEEN '2007-12-01' AND '2008-01-01';
+----------+----------------+---------------------+----------------+
| order_no | order_item     | order_date          | order_delivery |
+----------+----------------+---------------------+----------------+
|        2 | ipod Touch 4Gb | 2007-10-23 11:51:09 | 2007-12-23     |
+----------+----------------+---------------------+----------------+
1 row in set (0.03 sec)
```

<br>

<br>
