mysql количество дней в месяце

Изучаем MySQL: работа с датами и временем

В этой статье мы рассмотрим основы работы с датой и временем в MySQL.

Формат даты и времени

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 и режима, в котором работает сервер.

Создание полей даты и времени

Форматы даты и времени

Наиболее часто используемым разделителем для дат является тире ( — ), а для времени — двоеточие ( : ). Но мы можем использовать любой символ, или вообще не добавлять никакого символа.

Например, все следующие форматы являются правильными:

Функции даты и времени

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

ФункцияОписание
ADDDATE()Добавляет дату.
ADDTIME()Добавляет время.
CONVERT_TZ()Конвертирует из одного часового пояса в другой.
CURDATE()Возвращает текущую дату.
CURTIME()Возвращает текущее системное время.
DATE_ADD()Добавляет одну дату к другой.
MySQL DATE FORMAT ()Задает указанный формат даты.
DATE()Извлекает часть даты из даты или выражения дата-время.
DATEDIFF()Вычитает одну дату из другой.
DAYNAME()Возвращает день недели.
DAYOFMONTH()Возвращает день месяца (1-31).
DAYOFWEEK()Возвращает индекс дня недели из аргумента.
DAYOFYEAR()Возвращает день года (1-366).
EXTRACTИзвлекает часть даты.
FROM_DAYS()Преобразует номер дня в дату.
FROM_UNIXTIME()Задает формат даты в формате UNIX.
MySQL DATE_SUB ()Вычитает одну дату из другой.
HOUR()Извлекает час.
LAST_DAYВозвращает последний день месяца для аргумента.
MAKEDATE()Создает дату из года и дня года.
MAKETIME ()Возвращает значение времени.
MICROSECOND()Возвращает миллисекунды из аргумента.
MINUTE()Возвращает минуты из аргумента.
MONTH()Возвращает месяц из переданной даты.
MONTHNAME()Возвращает название месяца.
NOW()Возвращает текущую дату и время.
PERIOD_ADD()Добавляет интервал к месяцу-году.
PERIOD_DIFF()Возвращает количество месяцев между двумя периодами.
QUARTER()Возвращает четверть часа из переданной даты в качестве аргумента.
SEC_TO_TIME()Конвертирует секунды в формат ‘ЧЧ:MM:СС’.
SECOND()Возвращает секунду (0-59).
MySQL STR TO DATE ()Преобразует строку в дату.
SUBTIME()Вычитает время.
SYSDATE()Возвращает время, в которое была выполнена функция.
TIME_FORMAT()Задает формат времени.
TIME_TO_SEC()Возвращает аргумент, преобразованный в секунды.
TIME()Выбирает часть времени из выражения, передаваемого в качестве аргумента.
TIMEDIFF()Вычитает время.
TIMESTAMP()С одним аргументом эта функция возвращает дату или выражение дата-время. С двумя аргументами возвращается сумма аргументов.
TIMESTAMPADD()Добавляет интервал к дате-времени.
TIMESTAMPDIFF()Вычитает интервал из даты — времени.
TO_DAYS()Возвращает аргумент даты, преобразованный в дни.
UNIX_TIMESTAMP()Извлекает дату-время в формате UNIX в формат, принимаемый MySQL.
UTC_DATE()Возвращает текущую дату по универсальному времени (UTC).
UTC_TIME()Возвращает текущее время по универсальному времени (UTC).
UTC_TIMESTAMP()Возвращает текущую дату-время по универсальному времени (UTC).
WEEK()Возвращает номер недели.
WEEKDAY()Возвращает индекс дня недели.
WEEKOFYEAR()Возвращает календарную неделю даты (1-53).
YEAR()Возвращает год.
YEARWEEK()Возвращает год и неделю.

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

Внесение значений даты и времени в столбцы таблицы

Данный запрос создает заказ для указанного элемента с датой, временем выполнения заказа, и интервалом через две недели после этого в качестве даты доставки:

Точно так же можно заказать товар с датой доставки через два месяца:

Извлечение данных по дате и времени

В MySQL мы можем отфильтровать извлеченные данные в зависимости от даты и времени. Например, мы можем извлечь только те заказы, доставка которых запланирована на ноябрь:

Заключение

Источник

SQL функции даты и времени

mysql количество дней в месяце. Смотреть фото mysql количество дней в месяце. Смотреть картинку mysql количество дней в месяце. Картинка про mysql количество дней в месяце. Фото mysql количество дней в месяце

Приветствую Вас, уважаемые читатели блога webcodius.ru. В базе данных часто требуется хранить различные данные связанные с датой и временем. Это может быть дата добавления информации, дата регистрации пользователя, время последней автоизации и другие данные. В языке SQL есть множество функций связанных с датой и временем, сегодня их и рассмотрим.

Все ниже рассмотренные функции работают с календарными типами данных.

Получение текущей даты и времени.

Чтобы получить текущую дату и время используется функция NOW ().

SELECT NOW ()
Результат: 2015-09-25 14:42:53

Для получения только текущей даты есть функция CURDATE ().

SELECT CURDATE ()
Результат: 2015-09-25

И функция CURTIME (), которая возвращает только текущее время:

SELECT CURTIME ()
Результат: 14:42:53

Функции CURDATE () и NOW () удобно использовать для добавления в базу данных записей, для которых требуется хранить дату добавления. Например, при добавлении статьи на сайт хорошо бы хранить ее дату публикации. Тогда запрос на добавление статьи в базу будет примерно таким:

INSERT INTO posts (id_post, text_post, date_publication) VALUES (1, ‘текст статьи’, NOW ());

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

Функция ADDDATE (date, INTERVAL value) прибавляет к дате date значение value и возвращает полученное значение. В качестве value могут выступать следующие значения:

а также их комбинации:

SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL 1 DAY)
Результат: 2015-09-29 10:30:20

SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL ‘3 1:20’ DAY_MINUTE)
Результат: 2015-10-01 11:50:20

SELECT SUBDATE (‘2015-09-28 10:30:20’, INTERVAL 20 HOUR)
Результат: 2015-09-27 14:30:20

Функция PERIOD_ADD (period, n) прибавляет к значению period n месяцев. Значение период должно быть представлено в формате YYYYMM (например сентябрь 2015 года будет 201509). Пример:

SELECT PERIOD_ADD (201509, 4)
Результат: 201601

SELECT TIMESTAMPADD (QUARTER, 1, ‘2015-09-28’)
Результат: 2015-12-28

Функция SUBTIME (date, time) вычитает из даты date время time. Пример:

SELECT SUBTIME (‘2015-09-28 10:30:20′, ’50:20:19’)
Результат: 2015-09-26 08:10:01

Вычисление интервала между датами

Функция DATEDIFF (date1, date2) вычисляет разницу в днях между двумя датами, при этом часы, минуты и секунды при указании дат игнорируются. Пример:

SELECT DATEDIFF (‘2015-09-28 00:00:20’, ‘2015-09-27 23:40:20’)
Результат: 1

С помощью этой функции легко определить сколько дней прошло с даты публикации статьи:

SELECT DATEDIFF (CURDATE (), date_publication) FROM posts WHERE id_post = 1

SELECT PERIOD_DIFF (201509, 201501)
Результат: 9

SELECT TIMESTAMPDIFF (HOUR, ‘2015-09-28 10:30:20’, ‘2015-09-28 19:50:20’)
Результат: 9

Получение различных форматов даты и времени и другой информации

Функция DATE (datetime) возвращает дату, отсекая время. Пример:

SELECT DATE (‘2015-09-28 10:30:20’)
Результат: 2015-09-28

Функция TIME (datetime) возвращает время, отсекая дату. Пример:

SELECT TIME (‘2015-09-28 10:30:20’)
Результат: 10:30:20

TIMESTAMP (‘2015-09-28’)
Результат: 2015-09-28 00:00:00

DAY (date) и DAYOFMONTH (date). Функции-синонимы, которые возвращают порядковый номер дня месяца. Пример:

SELECT DAY (‘2015-09-28’), DAYOFMONTH (‘2015-09-28’)
Результат: 28 | 28

Функции DAYNAME (date), DAYOFWEEK (date) и WEEKDAY (date). Первая функция возвращает название дня недели, вторая — номер дня недели (отсчет от 1 — воскресенье до 7 — суббота), третья также номер дня недели только другой отсчет(отсчет от 0 — понедельник, до 6 — воскресенье). Пример:

SELECT DAYNAME (‘2015-09-28’), DAYOFWEEK (‘2015-09-28’), WEEKDAY (‘2015-09-28’)
Результат: Monday 2 | 0

Функции WEEK (date) и WEEKOFYEAR (datetime). Обе функции возвращают номер недели в году, только у первой неделя начинается с воскресенья, а у второй с понедельника. Пример:

SELECT WEEK (‘2015-09-28 10:30:20’), WEEKOFYEAR (‘2015-09-28 10:30:20’)
Результат: 39 | 40

Функция MONTH (date) возвращает числовое значение месяца (от 1 до 12), а MONTHNAME (date) название месяца. Пример:

SELECT MONTH (‘2015-09-28 10:30:20’), MONTHNAME (‘2015-09-28 10:30:20’)
Результат: 9 | September

Функция QUARTER (date) возвращает номер квартала года (от 1 до 4). Пример:

SELECT QUARTER (‘2015-09-28 10:30:20’)
Результат: 3

Функция YEAR (date) возвращает значение года (от 1000 до 9999). Пример:

SELECT YEAR (‘2015-09-28 10:30:20’)
Результат: 2015

Функция DAYOFYEAR (date) возвращает порядковый номер дня в году (от 1 до 366). Прмиер:

SELECT DAYOFYEAR (‘2015-09-28 10:30:20’)
Результат: 271

Функция HOUR (datetime) возвращает значение часа (от 0 до 23). Пример:

SELECT HOUR (‘2015-09-28 10:30:20’)
Результат: 10

Функция MINUTE (datetime) возвращает значение минут (от 0 до 59). Пример:

SELECT MINUTE (‘2015-09-28 10:30:20’)
Результат: 30

Функция SECOND (datetime) возвращает значение секунд (от 0 до 59). Пример:

SELECT SECOND (‘2015-09-28 10:30:20’)
Результат: 20

SELECT EXTRACT (YEAR FROM ‘2015-09-28 10:30:20’), EXTRACT (MONTH FROM ‘2015-09-28 10:30:20’), EXTRACT (DAY FROM ‘2015-09-28 10:30:20’), EXTRACT (HOUR FROM ‘2015-09-28 10:30:20’), EXTRACT (MINUTE FROM ‘2015-09-28 10:30:20’), EXTRACT (SECOND FROM ‘2015-09-28 10:30:20’)
Результат: 2015 | 9 | 28 | 10 | 30 | 20

Взаимообратные функции TO_DAYS (date) и FROM_DAYS (n). Первая преобразует дату в количество дней, прошедших с нулевого года. Вторая, наоборот, принимает число дней, прошедших с нулевого года и преобразует их в дату. Пример:

SELECT TO_DAYS (‘2015-09-28 10:30:20’), FROM_DAYS (736234)
Результат: 736234 | 2015-09-28

Взаимообратные функции UNIX_TIMESTAMP (date) и FROM_UNIXTIME (n). Первая преобразует дату в количество секунд, прошедших с 1 января 1970 года. Вторая, наоборот, принимает число секунд, с 1 января 1970 года и преобразует их в дату. Пример:

SELECT UNIX_TIMESTAMP (‘2015-09-28 10:30:20’), FROM_UNIXTIME (1443425420)
Результат: 1443425420 | 2015-09-28 10:30:20

Взаимообратные функции TIME_TO_SEC (time) и SEC_TO_TIME (n). Первая преобразует время в количество секунд, прошедших от начала суток. Вторая, наоборот, принимает число секунд с начала суток и преобразует их во время. Пример:

SELECT TIME_TO_SEC (’10:30:20′), SEC_TO_TIME (37820)
Результат: 37820 | 10:30:20

Функция MAKEDATE (year, n) принимает год year и номер дня в году n и преобразует их в дату. Пример:

SELECT MAKEDATE (2015, 271)
Результат: 2015-09-28

Источник

Календарные функции в MySQL и MariaDB

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

Не знаю, многие ли владеют информацией о наличии в MariaDB(MySQL) встроенного итератора возвращающего значения по заданному диапазону. Если кто не знает, то можно прочитать по ссылке.

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

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

Создадим 2 таблицы. Периодические ежегодные праздники и перенос выходных дней.

Зальём в таблицы периодические праздники

Обратите внимание, что в таблице holidays присутствует поле hdate_workday, используемое если перенос осуществлён с выходного дня, который переназначен рабочим. Например 20 февраля 2016 года приходится на субботу, но согласно положению правительства, данный день переносится на 22 февраля и обозначен как рабочий. Т.е. появляется рабочая суббота, после которой идёт 3 дня отдыха.

Начальные данные у нас есть, теперь магия SEQUENCE. Создадим таблицу календаря

Для заполнения таблицы создадим хранимую процедуру

Далее достаточно сделать простой запрос

Создание календаря по времени занимает просто копейки.

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

Собственно для чего это нужно? Это нужно для вычисления различной периодики в событиях. Например нужно понять на какое число приходится 6й рабочий день от начала месяца в январе 2017 года.

Или каким числом был понедельник для даты 15 декабря 2016 года.

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

где
DATETIME — дата или дата со временем

Если Offset указать отрицательным числом, то вычисление будет производиться назад.

В функции приведения дат, вычисление последних рабочих дней недели, месяца, года сделано независимо от календаря, т.е. для глобального календаря. Если нужна привязка к локальному календарю с праздничными днями, то лучше использовать ‘workday’ offset с отрицательным значением.

Надеюсь кому-то данный материал поможет в разработке.

Источник

Функции даты и времени MySQL

Ниже представлен пример, в котором используются функции даты. Приведенный запрос выбирает все записи с величиной date_col в течение последних 30 дней:

Возвращает порядковый номер дня месяца для аргумента date в диапазоне от 1 до 31:

Возвращает порядковый номер дня года для аргумента date в диапазоне от 1 до 366:

Возвращает порядковый номер месяца в году для аргумента date в диапазоне от 1 до 12:

Возвращает название дня недели для аргумента date :

Возвращает название месяца для аргумента date :

Возвращает номер квартала года для аргумента date в диапазоне от 1 до 4:

Вот как работает второй аргумент:

Примечание: в версии 4.0 функция WEEK(#,0) была изменена с целью соответствия календарю США.

Заметьте, если неделя является последней неделей прошлого года, MySQL вернет 0 если вы не указали 2 или 3 как опциональный аргумент:

Если вам все же важно уточнить корректную неделю в году, тогда вы можете использовать 2 или 3 как опциональный аргумент или использовать YEARWEEK()

Возвращает год для аргумента date в диапазоне от 1000 до 9999:

Возвращает час для аргумента time в диапазоне от 0 до 23:

Возвращает количество минут для аргумента time в диапазоне от 0 до 59:

Возвращает количество секунд для аргумента time в диапазоне от 0 до 59:

Значение TypeОжидаемый формат expr
SECONDSECONDS
MINUTEMINUTES
HOURHOURS
DAYDAYS
MONTHMONTHS
YEARYEARS
MINUTE_SECOND«MINUTES:SECONDS»
HOUR_MINUTE«HOURS:MINUTES»
DAY_HOUR«DAYS HOURS»
YEAR_MONTH«YEARS-MONTHS»
HOUR_SECOND«HOURS:MINUTES:SECONDS»
DAY_MINUTE«DAYS HOURS:MINUTES»
DAY_SECOND«DAYS HOURS:MINUTES:SECONDS»

Из предыдущего примера видно, что слово INTERVAL и ключевое слово type не являются регистро-зависимыми.

EXTRACT(type FROM date)

Функция TO_DAYS() не предназначена для использования с величинами, предшествующими введению григорианского календаря (1582), поскольку не учитывает дни, утерянные при изменении календаря.

Возвращает величину DATE для заданного номера дня N :

Функция FROM_DAYS() не предназначена для использования с величинами, предшествующими введению григорианского календаря (1582), поскольку она не учитывает дни, утерянные при изменении календаря.

ОпределительОписание
%MНазвание месяца (январь. декабрь)
%WНазвание дня недели (воскресенье. суббота)
%DДень месяца с английским суффиксом (0st, 1st, 2nd, 3rd и т.д.)
%YГод, число, 4 разряда
%yГод, число, 2 разряда
%XГод для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с ‘%V’
%xГод для недели, где воскресенье считается первым днем недели, число, 4 разряда, используется с ‘%v’
%aСокращенное наименование дня недели (Вс. Сб)
%dДень месяца, число (00..31)
%eДень месяца, число (0..31)
%mМесяц, число (00..12)
%cМесяц, число (0..12)
%bСокращенное наименование месяца (Янв. Дек)
%jДень года (001..366)
%HЧас (00..23)
%kЧас (0..23)
%hЧас (01..12)
%IЧас (01..12)
%lЧас (1..12)
%iМинуты, число (00..59)
%rВремя, 12-часовой формат (hh:mm:ss [AP]M)
%TВремя, 24-часовой формат (hh:mm:ss)
%SСекунды (00..59)
%sСекунды (00..59)
%pAM или PM
%wДень недели (0=воскресенье..6=суббота)
%UНеделя (00..53), где воскресенье считается первым днем недели
%uНеделя (00..53), где понедельник считается первым днем недели
%VНеделя (01..53), где воскресенье считается первым днем недели. Используется с ‘ %X ‘
%vНеделя (01..53), где понедельник считается первым днем недели. Используется с ‘ %x ‘
%%Литерал ‘ % ‘.

Все другие символы просто копируются в результирующее выражение без интерпретации:

В MySQL 3.23 символ ‘ % ‘ должен предшествовать символам определителя формата. В более ранних версиях MySQL символ ‘ % ‘ необязателен.

Источник

Работа с датой и временем в MySQL+PHP

Ниже представлен пример, в котором используются функции даты. Приведенный запрос выбирает все записи с величиной date_col в течение последних 30 дней:

Примечание: в версии 4.0 функция WEEK(#,0) была изменена с целью соответствия календарю США.
Заметьте, если неделя является последней неделей прошлого года, MySQL вернет 0 если вы не указали 2 или 3 как опциональный аргумент:

Можно считать, что MySQL должен вернуть 52, так как данная дата и является 52-ой неделей года 1999. Мы решили возвращать 0, так как мы хотим, чтобы функция давала «номер недели в указанном году». Это делает функцию WEEK() более надежной при использовании совместно с другими функциями, которые вычисляют части дат.

Если вам все же важно уточнить корректную неделю в году, тогда вы можете использовать 2 или 3 как опциональный аргумент или использовать YEARWEEK()

Обратите внимание, что номер недели отличается от того, который возвращает функция WEEK() (0), будучи вызванной с опциональным аргументом 0 или 1. Это потому, что WEEK() возвращает номер недели именно в указанном году.

HOUR(time)- Возвращает час для аргумента time в диапазоне от 0 до 23:

В MySQL формат выражения expr допускает любые разделительные знаки. Разделители, представленные в данной таблице, приведены в качестве примеров. Если аргумент date является величиной типа DATE и предполагаемые вычисления включают в себя только части YEAR, MONTH, и DAY (т.е. не содержат временной части TIME), то результат представляется величиной типа DATE. В других случаях результат представляет собой величину DATETIME:

При использовании некорректных значений дат результат будет равен NULL. Если при суммировании MONTH, YEAR_MONTH или YEAR номер дня в результирующей дате превышает максимальное количество дней в новом месяце, то номер дня результирующей даты принимается равным последнему дню нового месяца:

Из предыдущего примера видно, что слово INTERVAL и ключевое слово type не являются регистро-зависимыми.

Функция TO_DAYS() не предназначена для использования с величинами, предшествующими введению григорианского календаря (1582), поскольку не учитывает дни, утерянные при изменении календаря.

Функция FROM_DAYS() не предназначена для использования с величинами, предшествующими введению григорианского календаря (1582), поскольку она не учитывает дни, утерянные при изменении календаря.

Все другие символы просто копируются в результирующее выражение без интерпретации:

В MySQL 3.23 символ ‘%’ должен предшествовать символам определителя формата. В более ранних версиях MySQL символ ‘%’ необязателен.

Причина того, что промежутки для месяца и дня начинаются с нуля заключается в том, что MySQL позволяет использовать неполные даты, такие как ‘2004-00-00’, начиная с MySQL 3.23.

При использовании функции UNIX_TIMESTAMP в столбце TIMESTAMP эта функция будет возвращать величину внутренней временной метки непосредственно, без подразумеваемого преобразования строки во временную метку («string-to-unix-timestamp» ). Если заданная дата выходит за пределы допустимого диапазона, то функция UNIX_TIMESTAMP() возвратит 0, но следует учитывать, что выполняется только базовая проверка (год 1970-2037, месяц 01-12, день 01-31). Если необходимо выполнить вычитание столбцов UNIX_TIMESTAMP(), результат можно преобразовать к целым числам со знаком. See Раздел 6.3.5, «Функции приведения типов».

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *