Математические функции
| POW(num, power) | Вычисляет число в указанной степени |
| SQRT(num) | Вычисляет квадратный корень числа |
| LOG(base, num) | Вычисляет логарифм числа по указанному основанию |
| EXP(num) | Вычисляет enum |
| SIN(num) | Вычисляет синус числа |
| COS(num) | Вычисляет косинус числа |
| TAN(num) | Вычисляет тангенс числа |
Округление чисел
При работе с числами с плавающей точкой не всегда требуется сохранение или отображение чисел с полной точностью. Так, денежные транзакции можно хранить с точностью до 6 знаков после запятой, а отображать до 2, с точностью до копеек.
Для округления числовых данных в SQL предусмотрены следующие 4 функции: CEIL, FLOOR, ROUND, TRUNCATE.
Функции CEIL, FLOOR направлены на то, чтобы округлять число к ближайшему целому числу в большую и в меньшую сторону соответственно.
SELECT CEILING(69.69) AS ceiling, FLOOR(69.69) AS floor;
-- 70 и 69 на выходеДля округления к ближайшему целому числу есть функция ROUND, которая любое число, десятичная часть которого больше или равна 0.5, округляет в большую сторону, иначе в меньшую.
| ROUND(69.499) | ROUND(69.5) | ROUND(69.501) |
|---|---|---|
| 69 | 70 | 70 |
Функция ROUND также позволяет округлять число до некоторой части десятичных знаков после запятой. Для этого функция принимает второй необязательный аргумент с указанием количества знаков после запятой, которые требуется оставить.
SELECT ROUND(69.7171,1), ROUND(69.7171,2), ROUND(69.7171,3);Второй аргумент функции ROUND может принимать также и отрицательные значения. В этом случае, цифры слева от десятичной точки числа становятся равными нулю на указанное в аргументе количество, а дробная часть обрезается.
| ROUND(1691.7,-1) | ROUND(1691.7,-2) | ROUND(1691.7,-3) |
|---|---|---|
| 1690 | 1700 | 2000 |
Функция TRUNCATE аналогична функции ROUND, она также способна принимать 2-й необязательный параметр, только вместо округления она просто отбрасывает ненужные цифры.
| TRUNCATE(69.7979,1) | TRUNCATE(69.7979,2) | TRUNCATE(69.7979,3) |
|---|---|---|
| 69.7 | 69.79 | 69.797 |
Работа со знаковыми числами
При работе с числовыми данными, в которых возможно наличие отрицательных значений, могут быть полезными функции SIGN и ABS.
Функция SIGN возвращает значение -1, если число отрицательно, 0, если число нулевое и 1, если число положительное.
| SIGN(-69) | SIGN(0) | SIGN(69) |
|---|---|---|
| -1 | 0 | 1 |
Функция ABS возвращает абсолютное значение числа
| ABS(-69) | ABS(0) | ABS(69) |
|---|---|---|
| 69 | 0 | 69 |
Дата и время в SQL
| DATE | YYYY-MM-DD |
| DATETIME | YYYY-MM-DD hh:mm:ss |
| TIMESTAMP | YYYY-MM-DD hh:mm:ss |
| TIME | hhh:mm:sss |
| YEAR | YYYY — полный формат YY или Y — сокращённый формат, который возвращает год в пределах 2000-2069 для значений 0-69 и год в пределах 1970-1999 для значений 70-99 |
Причём, при указании даты допускается использовать любой знак пунктуации в качестве разделительного между частями разделов даты или времени. Также возможно задавать дату вообще без разделительного знака, слитно.
SELECT CAST("2022-06-16 16:37:23" AS DATETIME) AS datetime_1,
CAST("2014/02/22 16*37*22" AS DATETIME) AS datetime_2,
CAST("20220616163723" AS DATETIME) AS datetime_3,
CAST("2021-02-12" AS DATE) AS date_1,
CAST("160:23:13" AS TIME) AS time_1,
CAST("89" AS YEAR) AS yearЕсли необходимо получить временные данные из строки, которая не соответствует ни одному формату, который принимает функция CAST, то можно использовать встроенную функцию STR_TO_DATE, которая принимает произвольную строку, содержащую дату, и формат, описывающий её.
SELECT STR_TO_DATE('November 13, 1998', '%M %d, %Y') AS date;
// важно соблюдать порядок данных и мусора Для генерации же текущей даты или времени нет необходимости создавать строку для последующего её преобразования в дату, потому что есть встроенные функции для получения данных значений: CURDATE, CURTIME и NOW.
Функции извлечения временных данных
| YEAR | Возвращает год для указанной даты |
| MONTH | Возвращает числовое значение месяца года (от 1 до 12) даты |
| DAY | Возвращает порядковый номер дня в месяце (от 1 до 31) |
| HOUR | Возвращает значение часа (от 0 до 23) для времени |
| MINUTE | Возвращает значение минут (от 0 до 59) для времени |
Отличие DATETIME от TIMESTAMP
В MySQL есть очень похожие друг на друга типы данных: DATETIME и TIMESTAMP. Они оба направлены на хранение даты и времени, но имеют ряд отличий, определяющих их целевое использование.
| Критерий | DATETIME | TIMESTAMP |
|---|---|---|
| Диапазон | от 1000-01-01 00:00:00 до 9999-12-31 23:59:59 | от 1970-01-01 00:00:00 до 2038-01-19 03:14:07 |
| Часовой пояс | Не учитывается Отображается в таком виде, в котором дата была установлена | Учитывается При выборках отображается с учётом текущего часового пояса сервера БД |
Часовые пояса
В качестве точки отсчёта времени используется UTC (Coordinated Universal Time). Все остальные часовые пояса можно описать количеством часов сдвига от UTC. Для примера, часовой пояс Москвы может быть описан как UTC+3.
Часовой пояс является одной из настроек сервера баз данных и может задаваться:
SET GLOBAL time_zone = '+03:00'; // глобально
SET time_zone = '+03:00'; // для текущего пользователя
SET @@session.time_zone = '+03:00'; // для текущей пользовательской сессииNOW( ) — возвращает текущую дату и время
DAY() — возвращает день месяца
SELECT DAY('25.12.2017');
--Результат: 25MONTH() — возвращает месяц
SELECT MONTH('25.12.2017');
--Результат: 12YEAR() — возвращает год из значения даты
SELECT YEAR('2015-01-28');
--Результат: 2015Классика вычисления возраста/разницы по времени
TIMESTAMPDIFF(YEAR, '2003-07-03 14:10:26', NOW());Функции преобразования типов, CAST
Когда мы выполняем операции со значениями с разными типами данных, СУБД пытается выполнить преобразование и привести используемые значения к нужному типу. Например, в примере ниже мы сравниваем значения с типами STRING и INT. Чтобы выполнить это сравнение MySQL автоматически сконвертирует строковое значение в числовое.
SELECT '50' > 49, '50' > 51;Но не все преобразования СУБД может сделать автоматически, и тогда необходимо делать явное преобразование типов. Для этого в MySQL есть две очень схожие функции CAST и CONVERT.
CAST(значение AS тип_для_конвертации);
CONVERT(значение, тип_для_конвертации);| CAST(12005.6 AS DECIMAL) | CONVERT(12005.4, DECIMAL) |
|---|---|
| 12006 | 12005 |
Функция CAST умеет конвертировать переданное значение в любой из следующих типов:
| DATE | Конвертирует значение в DATE. Формат: «YYYY-MM-DD». |
| DATETIME | Конвертирует значение в DATETIME. Формат: «YYYY-MM-DD hh:mm:ss». |
| TIME | Конвертирует значение в TIME. Формат: «hh:mm:ss». |
| DECIMAL[(M[,D])] | Конвертирует значение в DECIMAL. Имеет два необязательных аргумента M и D, определяющих максимальное количество знаков до и после запятой соответственно. По умолчанию, D равен 0, а M равен 10. |
| CHAR[(N)] | Конвертирует значение в CHAR. В качестве необязательного аргумента можно передать максимальную длину строки. |
| SIGNED | Конвертирует значение в значение BIGINT. |
| UNSIGNED | Конвертирует значение в беззнаковое значение BIGINT. |
| BINARY | Конвертирует значение в BINARY. |
| YEAR | Конвертирует значение в год. |