даты в MySQL и работа с ними
на сегодняшний день мы имеем в распоряжении стабильную версию MySQL под индексом 5.1. Какие же возможности она предоставляет по работе с датой и временем? Заглянем в оф.ман и увидим там 59 функций практически на все случаи жизни…
Собственно написать статью меня побудил опыт чтения чужого кода, а в частности отношение людей к вопросам манипуляции датой (далее дата считается синонимом времени и наоборот). Так как основное время я провожу в среде WEB разработок, а серверным языком был выбран PHP, то соответствующая ему СУБД была выбрана незадумываясь - MySQL. Кстати, хочу заметить, что выбор пал на нее не только из-за наиболее частой связки по причине “так сложилось”, но и по идеологии самой системы. MySQL (мускул) как и PHP привлек своим разнообразием встроенных функций и простоте обращения, и хотя эта простота порождает ошибочное мнение о вседоступности в использовании, сразу хочу сказать, что тут как и в любом другом деле без опыта написать действительно стоящую вещь весьма и весьма тяжело, но об этом дальше…
Итак, сегодня речь пойдет о всем что представляет собой величину “время”. Вр́емя — интервал между событиями или момент, показываемый часами. В аспекте веб-разработок, это понятие используется достаточно часто, начиная от установки времени жизни cookies и заканчивая сложными процессами в системах высокой точности. Где время используется чаще всего? При построении отчетов. Каждый отчет представляет из себя агрегированный набор данных, по определенному признаку, который актуален для определенного промежутка времени. Вот для этой агрегации я видел множество решений, но только каждый раз встречаясь с подобным, могу только недоумевать: “Неужели тяжело было открыть документацию и увидеть что за вас уже все написано?”. Какой инструмент нам дает мускул?
Вкусность номер один — преобразование дат. DATE_ADD() и DATE_SUB() - два наиболее мощных инструмента, используемых чуть ли не каждый день. Первый позволяет добавить период к времени и получить на выходе существующую дату, второй же позволяет период от времени отнять. Почему я акцентировал внимание на слове “существующее”? да потому что 30 февраля не существует, хотя во многих системах его можно увидеть
Особая прелесть этих двух функций заключается в том, что мы можем манипулировать не только значением в днях (DAY), но и использовать такие абстрактные значения как неделя (WEEK) или квартал(QUARTER). часы (HOUR), минуты (MINUTE), секунды (SECOND) и даже микросекунды (MICROSECOND) доступны на равне с днями (DAY), месяцами (MONTH) и годами (YEAR). Как выглядит преобразование? пример:
SELECT NOW() AS period_start, ADD_DATE(NOW(), INTERVAL 1 MONTH) AS period_end
таким образом мы можем выбрать диапазон длинной в месяц начиная с текущего момента. Удобно? Конечно! Перенеся эту логику в PHP, мы бы имели что-то на подобии:
$end_date = date(”Y-m-d H:i:s” ,mktime(date(’H'), date(’i'), date(’s’), date(’m') + 1, date(’d'), date(’Y')));
согласитесь — не очень элегантно… А если подобных вычислений для достижения бизнес-логики много, то во что превратиться код?
Вкусность номер два — выделение части. MONTH(), DAY(), YEAR() и далее по аналогии… Что делают функции? Функции извлекают соответствующую их названию часть из полной даты. Кстати тут же есть еще обобщенный вариант — функция EXTRACT(). Ее использование сводиться к подобной манипуляции:
SELECT EXTRACT(YEAR FROM ‘1986-08-14′);
Что получим на выходе догадаться не сложно…
Вкусность третья — сопоставление дат. Этим занимается функция DATEDIFF(). Именно она позволяет найти разность между двумя предоставленными датами в днях. Возвращаемое значение может быть и отрицательным, если вторая дата предшествовала первой. Таким образом:
SELECT DATEDIFF(’1997-11-30 23:59:59′,’1997-12-31′);
получаем: -31
Просто? Конечно! И при этом вся логика по работе с данными проходит в СУБД, что позволяет гибче работать с данными из PHP (придерживаясь идеологии MVC), а так же становится независимой от серверного языка программирования.
Заключением хочется сделать акцент на том, что бы в своих веб-приложениях, операции по преобразованию дат и манипуляциями с ними сводились на СУБД (MySQL в этом плане с датами работает лучше всех остальных известных мне систем), а как результат экономилось время разработчиков, а так же время процессорное
Удачных экспериментов в области функциональной насыщенности мускула, а так же читайте документацию, господа ![]()
Сентябрь 28th, 2007 at 10:32
У меня проблем с датами не было, я читал в книге про даты, эксперементировал, вопросов не возникало. Но статья хорошая, только в начале много лишнего текста.
Декабрь 6th, 2007 at 05:45
Самая добная работа с датами в db2
Декабрь 6th, 2007 at 09:14
ну то что текущие значения вынесены на уровень констант — это еще не повод считать DB2 самым удобным для работы с датами…
функций много и на все случаи жизни есть
я MySQL люблю еще за то, что он как PHP “функциональный” в прямом смысле слова
Апрель 12th, 2008 at 14:07
“Как выглядит преобразование? пример:
SELECT NOW() AS period_start, ADD_DATE(NOW(), INTERVAL 1 MONTH) AS period_end”
Вы опечатались. В MySQL нет функции ADD_DATE. Есть DATE_ADD и ADDDATE.
За статью - огромное спасибо.
Октябрь 13th, 2008 at 13:43
Статья ни а чем, Вода водой. Мол бла бла бла, все и так есть, бла бла бла, я самый умный, курите мануалы
Декабрь 24th, 2008 at 18:51
аааа, валялся с последнего коммента)
нормальная статья. очерк вернее).
знаю много людей которым бы она пригодилась.
Январь 9th, 2009 at 17:05
сказал “а” - говори и “б”. В статье с таким названием желательно было бы отразить не только выбор дат из таблиц, но и особенности их записи…