SQL Работа с датами
SQL DATE
Пока ваши данные содержат только часть даты, ваши запросы будут работать так, как и ожидалось. Однако, если задействована временная часть, все становится еще сложнее.
SQL Типы данных даты
MySQL поставляется со следующими типами данных для хранения даты или значения даты/времени в базе данных:
SQL Server поставляется со следующими типами данных для хранения даты или значения даты/времени в базе данных:
Примечание: Типы дат выбираются для столбца при создании новой таблицы в базе данных!
SQL Работа с датами
Вы можете легко сравнить две даты, если нет никакого компонента времени!
Предположим, что у нас есть следующая таблица «Orders»:
OrderId | ProductName | OrderDate |
---|---|---|
1 | Geitost | 2008-11-11 |
2 | Camembert Pierrot | 2008-11-09 |
3 | Mozzarella di Giovanni | 2008-11-11 |
4 | Mascarpone Fabioli | 2008-10-29 |
Теперь мы хотим выбрать записи с порядковым номером «2008-11-11» из приведенной выше таблицы.
Мы используем следующую инструкцию SELECT:
Результирующий набор будет выглядеть следующим образом:
OrderId | ProductName | OrderDate |
---|---|---|
1 | Geitost | 2008-11-11 |
3 | Mozzarella di Giovanni | 2008-11-11 |
Теперь предположим, что таблица «Orders» выглядит следующим образом (обратите внимание на компонент time в столбце «OrderDate»):
OrderId | ProductName | OrderDate |
---|---|---|
1 | Geitost | 2008-11-11 13:23:44 |
2 | Camembert Pierrot | 2008-11-09 15:45:21 |
3 | Mozzarella di Giovanni | 2008-11-11 11:12:01 |
4 | Mascarpone Fabioli | 2008-10-29 14:56:59 |
Если мы используем тот же оператор SELECT, что и выше:
Мы не получим никакого результата! Это происходит потому, что запрос ищет только даты без временной части.
Совет: Чтобы ваши запросы были простыми и удобными в обслуживании, не допускайте компонентов времени в ваших датах!
Изучаем 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 мы можем отфильтровать извлеченные данные в зависимости от даты и времени. Например, мы можем извлечь только те заказы, доставка которых запланирована на ноябрь:
Заключение
date (Transact-SQL)
Определяет дату в SQL Server.
Описание типа данных date
Свойство | Значение |
---|---|
Синтаксис | date |
Использование | DECLARE @MyDate date |
CREATE TABLE Таблица1 ( Столбец1 date )
(используется для клиента нижнего уровня)
Дополнительные сведения см. в подразделе «Обратная совместимость для клиентов низкого уровня» следующего раздела.
От 1 января 1 года до 31 декабря 9999 года нашей эры (от 15 октября 1582 года до 31 декабря 9999 года для Informatica).
ММ обозначает 2 цифры, которые представляют месяц и принимают значения от 01 до 12.
ДД обозначает две цифры, представляющие день указанного месяца и принимающие значения от 01 до 31 в зависимости от месяца.
Это значение используется как присоединяемая часть даты при неявном преобразовании данных типа time в значение типа datetime2 или datetimeoffset.
Поддерживаемые форматы строковых литералов для типа данных date
В приведенной ниже таблице перечислены допустимые форматы строковых литералов для типа данных date.
Числовой | Описание |
---|---|
mdy [гг]гг-[м]м-дд | Сочетания [м]м, дд и [гг]гг представляют в строке месяц, день и год, разделенные символом косой черты (/), дефисом (-) или точкой (.). Поддерживаются только двух- и четырехзначные форматы записи года. Для записи года рекомендуется всегда использовать четырехзначный формат. Чтобы указать целое число в промежутке от 0001 до 9999, представляющее пороговое значение года при преобразовании двухзначной записи в четырехзначную, необходимо использовать параметр конфигурации сервера two digit year cutoff. Примечание. Для Informatica значение ГГГГ ограничено диапазоном от 1582 до 9999. Если двузначное число, обозначающее год, меньше или равно двузначному числу из последних двух цифр порогового года, год относится к тому же столетию, что и пороговый год. Если двузначное число, обозначающее год, больше двузначного числа из последних двух цифр порогового года, год относится к столетию, которое предшествует столетию порогового года. Например, если пороговое значение года для двухзначной записи равно 2049, то год, обозначенный двумя цифрами 49, интерпретируется как 2049, а год, обозначенный двумя цифрами 50, интерпретируется как 1950. Формат даты по умолчанию определяется текущими настройками языковых стандартов. Формат даты можно изменить с помощью инструкций SET LANGUAGE и SET DATEFORMAT. Формат гдм не поддерживается для типа данных date. |
Алфавитный формат | Описание |
---|---|
мес [дд][,] гггг гггг [дд] мес | Значение мес означает полное или сокращенное название месяца на текущем языке. Запятые являются необязательными, регистр букв не учитывается. Во избежание неоднозначности используйте четырехзначную запись года. Если не указано число месяца, подразумевается первое число месяца. |
ISO 8601 | Описание |
---|---|
ГГГГ-ММ-ДД ГГГГММДД | То же, что и стандарт SQL. Этот формат является единственным международным стандартом. |
Без разделителей | Описание |
---|---|
[гг]ггммдд гггг[мм][дд] | Данные типа date могут быть определены с помощью четырех, шести или восьми цифр. Строка из шести или восьми цифр всегда интерпретируется как гмд. На месяц и день всегда должно приходиться по две цифры. Строка из четырех цифр воспринимается как значение года. |
ODBC | Описание |
---|---|
Зависит от API-интерфейса ODBC. |
Формат W3C XML | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
гггг-мм-ддTZD | Введен для использования в XML и SOAP. Соответствие стандартам ANSI и ISO 8601Значение date соответствует стандартному определению ANSI SQL для григорианского календаря: «Замечание 85 — данные типа Datetime позволяют хранить даты григорианского календаря в виде чисел диапазона от 0001-01-01 CE до 9999–12–31 CE». Формат строковых литералов по умолчанию, используемый для клиентов низкого уровня, соответствует стандарту SQL, в котором он определен как ГГГГ-ММ-ДД. Данный формат аналогичен определению даты в стандарте ISO 8601. Для Informatica диапазон ограничен интервалом от 1582-10-15 (15 октября 1582 г.) до 9999-12-31 (31 декабря 9999 г.). Обратная совместимость для клиентов нижнего уровняНекоторые клиенты нижнего уровня не поддерживают типы данных time, date, datetime2 и datetimeoffset. В следующей таблице показано сопоставление типов экземпляра более высокого уровня SQL Server и клиентов низкого уровня.
Преобразование данных типа Date и TimeПри преобразовании в типы данных даты и времени SQL Server отвергает все значения, которые он не распознает как значения даты или времени. Сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в статье Функции CAST и CONVERT (Transact-SQL). Преобразование даты в другие типы данных даты и времениВ этом разделе описывается, что происходит при преобразовании типа данных date в другие типы даты и времени. Преобразование в time(n) завершается сбоем, и появляется сообщение об ошибке 206: «Конфликт типов операндов: date несовместим с time». Преобразование строковых литералов в датуПреобразование строковых литералов в типы данных даты и времени разрешается, если все части строк записаны в допустимом формате. Иначе возникает ошибка времени выполнения. Явные или скрытые преобразования, в которых не задан стиль преобразования типов данных даты и времени в строковые литералы, будут проведены в формате по умолчанию для текущего сеанса. В таблице ниже приводятся правила преобразования строковых литералов в тип данных date.
ПримерыВ следующем примере сравниваются результаты приведения строкового типа к каждому из типов данных date и time. SQL функции даты и времениПриветствую Вас, уважаемые читатели блога webcodius.ru. В базе данных часто требуется хранить различные данные связанные с датой и временем. Это может быть дата добавления информации, дата регистрации пользователя, время последней автоизации и другие данные. В языке SQL есть множество функций связанных с датой и временем, сегодня их и рассмотрим. Все ниже рассмотренные функции работают с календарными типами данных. Получение текущей даты и времени.Чтобы получить текущую дату и время используется функция NOW (). SELECT NOW () Для получения только текущей даты есть функция CURDATE (). SELECT CURDATE () И функция CURTIME (), которая возвращает только текущее время: SELECT CURTIME () Функции 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) SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL ‘3 1:20’ DAY_MINUTE) SELECT SUBDATE (‘2015-09-28 10:30:20’, INTERVAL 20 HOUR) Функция PERIOD_ADD (period, n) прибавляет к значению period n месяцев. Значение период должно быть представлено в формате YYYYMM (например сентябрь 2015 года будет 201509). Пример: SELECT PERIOD_ADD (201509, 4) SELECT TIMESTAMPADD (QUARTER, 1, ‘2015-09-28’) Функция SUBTIME (date, time) вычитает из даты date время time. Пример: SELECT SUBTIME (‘2015-09-28 10:30:20′, ’50:20:19’) Вычисление интервала между датамиФункция DATEDIFF (date1, date2) вычисляет разницу в днях между двумя датами, при этом часы, минуты и секунды при указании дат игнорируются. Пример: SELECT DATEDIFF (‘2015-09-28 00:00:20’, ‘2015-09-27 23:40:20’) С помощью этой функции легко определить сколько дней прошло с даты публикации статьи: SELECT DATEDIFF (CURDATE (), date_publication) FROM posts WHERE id_post = 1 SELECT PERIOD_DIFF (201509, 201501) SELECT TIMESTAMPDIFF (HOUR, ‘2015-09-28 10:30:20’, ‘2015-09-28 19:50:20’) Получение различных форматов даты и времени и другой информацииФункция DATE (datetime) возвращает дату, отсекая время. Пример: SELECT DATE (‘2015-09-28 10:30:20’) Функция TIME (datetime) возвращает время, отсекая дату. Пример: SELECT TIME (‘2015-09-28 10:30:20’) TIMESTAMP (‘2015-09-28’) DAY (date) и DAYOFMONTH (date). Функции-синонимы, которые возвращают порядковый номер дня месяца. Пример: SELECT DAY (‘2015-09-28’), DAYOFMONTH (‘2015-09-28’) Функции DAYNAME (date), DAYOFWEEK (date) и WEEKDAY (date). Первая функция возвращает название дня недели, вторая — номер дня недели (отсчет от 1 — воскресенье до 7 — суббота), третья также номер дня недели только другой отсчет(отсчет от 0 — понедельник, до 6 — воскресенье). Пример: SELECT DAYNAME (‘2015-09-28’), DAYOFWEEK (‘2015-09-28’), WEEKDAY (‘2015-09-28’) Функции WEEK (date) и WEEKOFYEAR (datetime). Обе функции возвращают номер недели в году, только у первой неделя начинается с воскресенья, а у второй с понедельника. Пример: SELECT WEEK (‘2015-09-28 10:30:20’), WEEKOFYEAR (‘2015-09-28 10:30:20’) Функция MONTH (date) возвращает числовое значение месяца (от 1 до 12), а MONTHNAME (date) название месяца. Пример: SELECT MONTH (‘2015-09-28 10:30:20’), MONTHNAME (‘2015-09-28 10:30:20’) Функция QUARTER (date) возвращает номер квартала года (от 1 до 4). Пример: SELECT QUARTER (‘2015-09-28 10:30:20’) Функция YEAR (date) возвращает значение года (от 1000 до 9999). Пример: SELECT YEAR (‘2015-09-28 10:30:20’) Функция DAYOFYEAR (date) возвращает порядковый номер дня в году (от 1 до 366). Прмиер: SELECT DAYOFYEAR (‘2015-09-28 10:30:20’) Функция HOUR (datetime) возвращает значение часа (от 0 до 23). Пример: SELECT HOUR (‘2015-09-28 10:30:20’) Функция MINUTE (datetime) возвращает значение минут (от 0 до 59). Пример: SELECT MINUTE (‘2015-09-28 10:30:20’) Функция SECOND (datetime) возвращает значение секунд (от 0 до 59). Пример: SELECT SECOND (‘2015-09-28 10:30: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’) Взаимообратные функции TO_DAYS (date) и FROM_DAYS (n). Первая преобразует дату в количество дней, прошедших с нулевого года. Вторая, наоборот, принимает число дней, прошедших с нулевого года и преобразует их в дату. Пример: SELECT TO_DAYS (‘2015-09-28 10:30:20’), FROM_DAYS (736234) Взаимообратные функции UNIX_TIMESTAMP (date) и FROM_UNIXTIME (n). Первая преобразует дату в количество секунд, прошедших с 1 января 1970 года. Вторая, наоборот, принимает число секунд, с 1 января 1970 года и преобразует их в дату. Пример: SELECT UNIX_TIMESTAMP (‘2015-09-28 10:30:20’), FROM_UNIXTIME (1443425420) Взаимообратные функции TIME_TO_SEC (time) и SEC_TO_TIME (n). Первая преобразует время в количество секунд, прошедших от начала суток. Вторая, наоборот, принимает число секунд с начала суток и преобразует их во время. Пример: SELECT TIME_TO_SEC (’10:30:20′), SEC_TO_TIME (37820) Функция MAKEDATE (year, n) принимает год year и номер дня в году n и преобразует их в дату. Пример: SELECT MAKEDATE (2015, 271) Теперь вы знаете какие однокоренные слова подходят к слову Как написать дату в запросе sql, а так же какой у него корень, приставка, суффикс и окончание. Вы можете дополнить список однокоренных слов к слову "Как написать дату в запросе sql", предложив свой вариант в комментариях ниже, а также выразить свое несогласие проведенным с морфемным разбором. |