Работа числами и датами

Математические функции

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)
697070

Функция 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)
169017002000

Функция TRUNCATE аналогична функции ROUND, она также способна принимать 2-й необязательный параметр, только вместо округления она просто отбрасывает ненужные цифры.

TRUNCATE(69.7979,1)TRUNCATE(69.7979,2)TRUNCATE(69.7979,3)
69.769.7969.797

Работа со знаковыми числами

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

Функция SIGN возвращает значение -1, если число отрицательно, 0, если число нулевое и 1, если число положительное.

SIGN(-69)SIGN(0)SIGN(69)
-101

Функция ABS возвращает абсолютное значение числа

ABS(-69)ABS(0)ABS(69)
69069

Дата и время в SQL

DATEYYYY-MM-DD
DATETIMEYYYY-MM-DD hh:mm:ss
TIMESTAMPYYYY-MM-DD hh:mm:ss
TIMEhhh:mm:sss
YEARYYYY — полный формат
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. Они оба направлены на хранение даты и времени, но имеют ряд отличий, определяющих их целевое использование.

КритерийDATETIMETIMESTAMP
Диапазонот 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');
--Результат: 25

MONTH() — возвращает месяц

SELECT MONTH('25.12.2017');
--Результат: 12

YEAR() — возвращает год из значения даты

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)
1200612005

Функция 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Конвертирует значение в год.