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

<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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://olexsyn.gitbook.io/enote/data/mysql/functions/funkcii-dlya-raboty-s-datami-i-vremenem.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
