База данных 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(), позволяющая объединить отдельные элементы в единую строковую конструкцию.