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


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

Опубликовано

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

Формат даты

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

YYYY-MM-DD

2012-08-18

 

Текущая дата

Первая функция, с которой я хотел бы начать это CURDATE(), возвращает текущую дату в формате MySQL.

SELECT CURDATE(); //Результат "2012-08-19"

 

Разбиение даты на фрагменты

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

YEAR() – выбор года из даты:

SELECT YEAR("2012-08-19"); //Результат "2012"

MONTH() или MONTHNAME() – выбор месяца из даты, первая функция - цифровое значение месяца, вторая его название:

SELECT MONTH("2012-08-19"); //Результат "8"

SELECT MONTHNAME("2012-08-19"); //Результат "August"

DAYOFMONTH() – выбор дня из даты:

SELECT DAYOFMONTH("2012-08-19"); //Результат "19"

 

Прибавление и вычитание из даты временного интервала

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

DATE_ADD() – прибавляет к дате временной промежуток;

SELECT DATE_ADD("2012-08-19",Interval 20 DAY); //Результат "2012-09-08"

SELECT DATE_ADD("2012-08-19",Interval 2 MONTH);//Результат "2012-10-19"

SELECT DATE_ADD("2012-08-19",Interval 3 YEAR); //Результат "2015-08-19"

Из представленных запросов видно: в первом к текущей дате прибавляются 20 дней, во втором два месяца, в третьем 3 года. 

DATE_SUB() – вычитает из даты временной промежуток, работает аналогично функции DATE_ADD();

SELECT DATE_SUB("2012-08-19",Interval 20 DAY);

SELECT DATE_SUB("2012-08-19",Interval 2 MONTH);

SELECT DATE_SUB("2012-08-19",Interval 3 YEAR);

 

Преобразование даты в дни

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

SELECT TO_DAYS("2012-08-31")-TO_DAYS("2012-08-16"); //Результат "15"

 

Пример

Рассмотрим небольшой пример, который включает в себя все раннее представленные функции. Предположим, в базе существует таблица clients, в которой ведется учет постояльцев гостиницы.

 

Необходимо отобрать всех клиентов, у которых заканчивается срок пребывания в течение 5 дней, начиная с текущей даты (2012-08-19).

SELECT 
 clients.firstname,
 clients.lastname,
 clients.dateout
FROM clients
WHERE 
 clients.dateout>=CURDATE() and
 clients.dateout<=DATE_ADD(CURDATE(),Interval 5 DAY)

 

Запрос выполнен успешно, нужные клиенты и их данные отображены. Однако полученные данные не совсем полны и к тому же не очень удобные для пользователя. Немного усовершенствовав запрос можно получить более подробный и удобочитаемый результат.

SELECT 
 CONCAT(firstname," ",lastname) as client,
 CONCAT(DAYOFMONTH(datein)," ",MONTHNAME(datein)," ",YEAR(datein)) as datein,
 CONCAT(DAYOFMONTH(CURDATE())," ",MONTHNAME(CURDATE())," ",YEAR(CURDATE())) as curdate,
 CONCAT("выезд через ",TO_DAYS(dateout)-TO_DAYS(CURDATE())," дня") as dateout
FROM clients
WHERE 
 dateout>=CURDATE() and
 dateout<=DATE_ADD(CURDATE(),Interval 5 DAY)
ORDER BY client

 

В запросе была использована дополнительная функция CONCAT(), позволяющая объединить отдельные элементы в единую строковую конструкцию.