Руководство по SQL. Функции даты.

Ниже приведён список важных функций, которые относятся к дате и времени. Все данные функции доступны для работы с помощью SQL.

Примеры, приведённые ниже предназначены для RDBMS MySQL.

Name Description
ADDDATE() Добавляет дату
ADDTIME() Добавляет время
CONVERT_TZ() Конвертирует одну временную зону в другую.
CURDATE() Возвращает текущую дату.
CURRENT_DATE(), CURRENT_DATE То же самое, что и CURDATE.
CURTIME() Возвращает текущее время
NOW() Возвращает текущие дату и время.
CURRENT_TIME(), CURRENT_TIME То же самое, что и NOW()
DATE_ADD() Добавляет две даты
DATE_FORMAT() Определяет формат даты
DATE_SUB() Разбивает две даты
DATE() Возвращает только дату (число, месяц, год) из даты.
DATEDIFF() Разделяет две даты
DAY() То же самое, что и DAYOFMONTH()
DAYNAME() Возвращает имя дня недели.
DAYOFMONTH() Возвращает день месяца
DAYOFWEEK() Возвращает индекс аргумента дня недели
DAYOFYEAR() Возвращает номер дня в году (1 – 366)
EXTRACT Выдаёт часть даты
FROM_DAYS() Конвертирует номер дня в дату.
FROM_UNIXTIME() Форматирует дату в дата/время для UNIX систем.
HOUR() Возвращает часы
LAST_DAY Возвращает крайний день месяца.
LOCALTIME(), LOCALTIME То же самое, что и NOW()
LOCALTIMESTAMP, LOCALTIMESTAMP() То же самое, что и NOW()
MAKEDATE() Создаёт дату из года и дня в году
MAKETIME Создаёт время
MICROSECOND() Возвращает микросекунды
MINUTE() Возвращает только минуты
MONTH() Возвращает только месяц
MONTHNAME() Возвращает имя месяца
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP Синоним для NOW()
PERIOD_ADD() Добавляет период для в месяце-году.
PERIOD_DIFF() Возвращает количество месяцев в периоде.
QUARTER() Возвращает квартал
SEC_TO_TIME() Конвертирует секунды в формат ‘ЧЧ:ММ:СС’
SECOND() Возвращает секунды (0 – 59)
STR_TO_DATE() Конвертирует строку в дату
SUBDATE() То же самое, что и DATE_SUB() Требует три аргумента
SUBTIME() Разделяет время
SYSDATE() Возвращает системное время
TIME_FORMAT() Определяет формат времени
TIME_TO_SEC() Конвертирует время в секунды
TIME() Возвращает время.
TIMEDIFF() Отделяет время
TIMESTAMP() Возвращает текущие дату и время.
TIMESTAMPADD() Добавляет период дата/время
IMESTAMPDIFF() Отделяет интервал из дата/время
TO_DAYS() Конвертирует дату в дни
UNIX_TIMESTAMP() Возвращает дату/время для UNIX систем
UTC_DATE() Возвращает дату UTC
UTC_TIME() Возвращает время UTC
UTC_TIMESTAMP() Возвращает дату/время UTC
WEEK() Возвращает номер недели
WEEKDAY() Возвращает индекс дня недели
WEEKOFYEAR() Возвращает номер недели в году (1 – 53)
YEAR() Возвращает год
YEARWEEK() Возвращает год и неделю

Примеры

Добавление даты (ADDDATE)


mysql> SELECT DATE_ADD('2016-06-30', INTERVAL 30 DAY);
+-----------------------------------------+
| DATE_ADD('2016-06-30', INTERVAL 30 DAY) |
+-----------------------------------------+
| 2016-07-30                              |
+-----------------------------------------+
1 row in set (0.00 sec)

Добавление времени (ADDTIME)


mysql> SELECT ADDTIME('2016-06-06 23:59:59', '2 2:2:2.0');
+---------------------------------------------+
| ADDTIME('2016-06-06 23:59:59', '2 2:2:2.0') |
+---------------------------------------------+
| 2016-06-09 02:02:01                         |
+---------------------------------------------+
1 row in set (0.00 sec)

Конвертация временной зоны (CONVERT_TZ)


mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+03:00');
+-----------------------------------------------------+
| CONVERT_TZ('2004-01-01 12:00:00','+00:00','+03:00') |
+-----------------------------------------------------+
| 2004-01-01 15:00:00                                 |
+-----------------------------------------------------+
1 row in set (0.00 sec)

Текущая дата (CURDATE())


mysql> SELECT CURDATE();
+------------+
| CURDATE()  |
+------------+
| 2016-06-04 |
+------------+
1 row in set (0.00 sec)

Текущее время (CURTIME())


mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 14:19:55  |
+-----------+
1 row in set (0.00 sec)

Дата (DATE)


mysql> SELECT DATE('2016-06-04 15:00:00');
+-----------------------------+
| DATE('2016-06-04 15:00:00') |
+-----------------------------+
| 2016-06-04                  |
+-----------------------------+
1 row in set (0.00 sec)

Разница во времени (DATEDIFF())


mysql> SELECT DATEDIFF ('2016-06-06 00:00:00', '1988-10-28 12:00:00');
+---------------------------------------------------------+
| DATEDIFF ('2016-06-06 00:00:00', '1988-10-28 12:00:00') |
+---------------------------------------------------------+
|                                                   10083 |
+---------------------------------------------------------+
1 row in set (0.00 sec)

Добавление даты (DATEADD(), DATE_SUB())
Данные функции обеспечивают арифметику дат. Мы можем добавить или отнять определённый интервал времени от определённой даты.

Ниже приведена таблица, в которой указаны возможные аргументы для интервалов:

Значение Ожидаемый формат
MICROSECOND Микросекунды
SECOND Секунды
MINUTE Минуты
HOUR Часы
DAY Дни
WEEK Недели
MONTH Месяцы
QUARTER Кварталы
YEAR Годы
SECOND_MICROSECOND ‘Секунды.Микросекунды’
MINUTE_MICROSECOND Минуты.Микросекунды’
MINUTE_SECOND ‘Минуты.Секунды’
HOUR_MICROSECOND ‘Часы.Микросекунды’
HOUR_SECOND ‘Часы.Секунды.Микросекунды’
HOUR_MINUTE ‘Часы.Минуты’
DAY_MICROSECOND ‘Дни.Микросекунды’
DAY_SECOND Дни.Часы.Минуты.Секунды
DAY_MINUTE Дни.Часы.Минуты
DAY_HOUR Дни.Часы
YEAR_MONTH Года.Месяцы

mysql> SELECT DATE_ADD('2016-06-04 20:00:00', INTERVAL '1:1' DAY_HOUR);
+----------------------------------------------------------+
| DATE_ADD('2016-06-04 20:00:00', INTERVAL '1:1' DAY_HOUR) |
+----------------------------------------------------------+
| 2016-06-05 21:00:00                                      |
+----------------------------------------------------------+
1 row in set (0.00 sec)

Формат даты
Формат даты определяется с помощью специальных символов.
Список таких символов приведён в таблице, которая находится ниже:

Спецификатор Описание
%a Сокращённое имя дня недели
%b Сокращённое имя месяца
%c Номер месяца
%D День месяца с английским суффиксом
%d Номер дня в месяце (00 … 31)
%e Номер дня в месяце (0 … 31)
%f Микросекунды (000000 … 999999)
%H Часы (00 … 23)
%h Часы (01 … 12)
%I Часы (01 … 12)
%i Минуты (00 … 59)
%j Дни года (001 … 366)
%k Часы (00 … 23)
%l Часы (1 … 12)
%M Имя месяца
%m Номер месяца
%p AM или PM
%r Время с использованием AM или PM
%S Секунды (00 … 59)
%s Секунды (00 … 59)
%T Время (ЧЧ:ММ:СС)
%U Неделя (00 … 53). Первый день недели – Воскресенье
%u Неделя (00 … 53). Первый день недели – Понедельник
%V Неделя (00 … 53). Первый день недели – Воскресенье. Используется с %X
%v Неделя (00 … 53). Первый день недели – Понедельник. Используется с %x
%W День недели
%w День недели (0 – Воскресенье … 6 – Суббота)
%X Год для недели. Воскресенье – первый день недели. Используется с %V
%x Год для недели. Понедельник – первый день недели. Используется с %v
%Y Год  (YYYY)
%y Год (YY)
%% Символ .%.
%x То же самое для любых элементов, указанных выше

mysql> SELECT DATE_FORMAT ('2016-06-04 22:00:00', '%W %M %Y');
+-------------------------------------------------+
| DATE_FORMAT ('2016-06-04 22:00:00', '%W %M %Y') |
+-------------------------------------------------+
| Saturday June 2016                              |
+-------------------------------------------------+
1 row in set (0.00 sec)

Имя дня (DAYNAME())


mysql> SELECT DAYNAME('1988-10-28');
+-----------------------+
| DAYNAME('1988-10-28') |
+-----------------------+
| Friday                |
+-----------------------+
1 row in set (0.00 sec)

День месяца (DAYOFMONTH())


mysql> SELECT DAYOFMONTH('1988-10-28');
+--------------------------+
| DAYOFMONTH('1988-10-28') |
+--------------------------+
|                       28 |
+--------------------------+
1 row in set (0.01 sec)

День недели (DAYOFWEEK())


mysql> SELECT DAYOFWEEK('1988-10-28');
+-------------------------+
| DAYOFWEEK('1988-10-28') |
+-------------------------+
|                       6 |
+-------------------------+
1 row in set (0.00 sec)

День в году (DAYOFYEAR())


mysql> SELECT DAYOFYEAR('1988-10-28');
+-------------------------+
| DAYOFYEAR('1988-10-28') |
+-------------------------+
|                     302 |
+-------------------------+
1 row in set (0.00 sec)

Неделя (WEEK())


mysql> SELECT WEEK('1988-10-28');
+--------------------+
| WEEK('1988-10-28') |
+--------------------+
|                 43 |
+--------------------+
1 row in set (0.00 sec)

На этом мы заканчиваем изучение функций даты в языке SQL.
В следующей статье мы рассмотрим временные таблицы.