Последнее обновление
SUB_TIME
Описание
Вычитает указанный временной интервал из выражения даты и времени или времени. Если второй параметр отрицательный, это эквивалентно прибавлению интервала к первому параметру.
Синтаксис
SUB_TIME(`<date_or_time_expr>`, `<time>`)
Параметры
| Параметр | Описание |
|---|---|
<date_or_time_expr> | Допустимое выражение даты. Поддерживаются входные значения типов TIMESTAMPTZ/TIMESTAMP_NS/DATETIME/DATE/TIME. Для типа date значение преобразуется во время начала дня (00:00:00). Подробнее о форматах см. преобразование timestamptz, преобразование datetime и преобразование time. |
<time> | Допустимое выражение времени, представляющее значение времени, которое нужно вычесть из <date_or_time_expr>. Отрицательное значение означает прибавление. Поддерживаются входные значения типа time. |
Возвращаемое значение
Для входного значения типа TIMESTAMP_NS возвращается значение типа TIMESTAMP_NS с фиксированным числом знаков в дробной части секунды: девять. Результаты проверяются на соответствие диапазону возвращаемого типа; для TIMESTAMP_NS используется диапазон [1677-09-21 00:12:43.145224192, 2262-04-11 23:47:16.854775807].
Возвращает результат вычитания <time> из <date_or_time_expr>. Возвращаемый тип зависит от типа первого параметра:
- Если первый параметр имеет тип timestamp, возвращается значение типа timestamp.
- Если первый параметр имеет тип datetime, возвращается значение типа datetime.
- Если первый параметр имеет тип time, возвращается значение типа time.
Особые случаи:
- Если любой входной параметр равен null, возвращается null.
- Если первый параметр имеет тип time и результат выходит за диапазон типа time, возвращается максимальное (или минимальное) значение времени.
- Если первый параметр имеет тип datetime или timestamptz и результат выходит за диапазон типа datetime, возникает ошибка.
Примеры
-- Subtract time when the first parameter is datetime type
SELECT SUB_TIME('2025-09-19 12:00:00', '01:30:00');
+---------------------------------------------+
| SUB_TIME('2025-09-19 12:00:00', '01:30:00') |
+---------------------------------------------+
| 2025-09-19 10:30:00 |
+---------------------------------------------+
-- Subtract time when the first parameter is time type
SELECT SUB_TIME(cast('12:15:20' as time), '00:10:40');
+------------------------------------------------+
| SUB_TIME(cast('12:15:20' as time), '00:10:40') |
+------------------------------------------------+
| 12:04:40 |
+------------------------------------------------+
-- SET time_zone = '+08:00'
select sub_time('2025-10-10 11:22:33+03:00', '3:22:33.123');
+------------------------------------------------------+
| sub_time('2025-10-10 11:22:33+03:00', '3:22:33.123') |
+------------------------------------------------------+
| 2025-10-10 12:59:59.877+08:00 |
+------------------------------------------------------+
-- NULL parameter test
SELECT SUB_TIME(NULL, '01:00:00');
+----------------------------+
| SUB_TIME(NULL, '01:00:00') |
+----------------------------+
| NULL |
+----------------------------+
SELECT SUB_TIME('2025-09-19 12:00:00', NULL);
+---------------------------------------+
| SUB_TIME('2025-09-19 12:00:00', NULL) |
+---------------------------------------+
| NULL |
+---------------------------------------+
SELECT SUB_TIME(NULL, NULL);
+----------------------+
| SUB_TIME(NULL, NULL) |
+----------------------+
| NULL |
+----------------------+
-- Time type out-of-range test (returns max/min value)
SELECT SUB_TIME(cast('835:30:00' as time), '-21:00:00');
+--------------------------------------------------+
| SUB_TIME(cast('835:30:00' as time), '-21:00:00') |
+--------------------------------------------------+
| 838:59:59 |
+--------------------------------------------------+
SELECT SUB_TIME(cast('-832:30:00' as time), '31:00:00');
+---------------------------------------------------+
| SUB_TIME(cast('-832:30:00' as time), '31:00:00') |
+---------------------------------------------------+
| -838:59:59 |
+---------------------------------------------------+
-- Datetime type out-of-range test (throws error)
SELECT SUB_TIME('0000-01-01 00:00:00', '00:00:01');
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.3)[INVALID_ARGUMENT]datetime value is out of range in function sub_time
SELECT SUB_TIME('9999-12-31 23:59:59', '-00:00:01');
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.3)[INVALID_ARGUMENT]datetime value is out of range in function sub_time