SUBTIME() Examples – MySQL

In MySQL, you can use the SUBTIME() function to subtract a time value from a time or datetime expression.

The way it works is, you provide two arguments; the first is a time or datetime value, and the second is a time value. The SUBTIME() function then subtracts the second argument from the first one and returns the result.

Syntax

The syntax goes like this:

SUBTIME(expr1,expr2)

Where expr1 can be either a time or datetime expression, and expr2 is a time expression.

And so expr2 is subtracted from expr1.

Example 1 – Basic Usage

Here’s an example to demonstrate.

SELECT SUBTIME('12:35:00', '1:30');

Result:

+-----------------------------+
| SUBTIME('12:35:00', '1:30') |
+-----------------------------+
| 11:05:00                    |
+-----------------------------+

Example 2 – Subtracting Seconds

In this example, I also subtract a number of seconds from the time value.

SELECT SUBTIME('12:35:00', '1:30:30');

Result:

+--------------------------------+
| SUBTIME('12:35:00', '1:30:30') |
+--------------------------------+
| 11:04:30                       |
+--------------------------------+

And we get the same result even if we omit the seconds part from the initial time argument.

SELECT SUBTIME('12:35', '1:30:30');

Result:

+-----------------------------+
| SUBTIME('12:35', '1:30:30') |
+-----------------------------+
| 11:04:30                    |
+-----------------------------+

Example 3 – Fractional Seconds

You can also subtract the fractional seconds part.

SELECT SUBTIME('12:35:00.888888', '1:30:30.555555');

Result:

+----------------------------------------------+
| SUBTIME('12:35:00.888888', '1:30:30.555555') |
+----------------------------------------------+
| 11:04:30.333333                              |
+----------------------------------------------+

Example 4 – Negative Results

It’s quite valid to end up with a negative value for your result.

SELECT SUBTIME('12:35:00', '20:30:30');

Result:

+---------------------------------+
| SUBTIME('12:35:00', '20:30:30') |
+---------------------------------+
| -07:55:30                       |
+---------------------------------+

Example 5 – Subtract from a Datetime Value

In this example I subtract from a datetime value (as opposed to just a time value like in the previous examples).

SELECT SUBTIME('2021-01-01 12:35:00', '1:30:30');

Result:

+-------------------------------------------+
| SUBTIME('2021-01-01 12:35:00', '1:30:30') |
+-------------------------------------------+
| 2021-01-01 11:04:30                       |
+-------------------------------------------+

In this case, the date part was unchanged, as the second argument wasn’t large enough to affect it.

In this next example, I increase the second argument so that it’s large enough to affect the date part.

SELECT SUBTIME('2021-01-01 12:35:00', '100:30:30');

Result:

+---------------------------------------------+
| SUBTIME('2021-01-01 12:35:00', '100:30:30') |
+---------------------------------------------+
| 2020-12-28 08:04:30                         |
+---------------------------------------------+

As seen in this example, time values aren’t restricted to being less than 24 hours (they can range from -838:59:59 to 838:59:59.

However, you can also do stuff like this:

SELECT SUBTIME('2021-01-01 12:35:00', '4 4:30:30');

Result:

+---------------------------------------------+
| SUBTIME('2021-01-01 12:35:00', '4 4:30:30') |
+---------------------------------------------+
| 2020-12-28 08:04:30                         |
+---------------------------------------------+

Example 6 – Limitations of the time Value

As mentioned, the time data type can range from -838:59:59 to 838:59:59. This means that you can’t subtract any more than that. It also means that the result can’t be outside of this range. For example, you can’t do this:

SELECT SUBTIME('12:35:00', '20000000:30:30');

Result:

+---------------------------------------+
| SUBTIME('12:35:00', '20000000:30:30') |
+---------------------------------------+
| -826:24:59                            |
+---------------------------------------+
1 row in set, 1 warning (0.01 sec)

The result is completely wrong and MySQL displays a warning.

But it’s not just the second argument you need to be careful of.  You’ll also run into the same issue if the first argument is initially a negative value:

SELECT SUBTIME('-800:35:00', '50:30:30');

Result:

+-----------------------------------+
| SUBTIME('-800:35:00', '50:30:30') |
+-----------------------------------+
| -838:59:59                        |
+-----------------------------------+
1 row in set, 1 warning (0.00 sec)