How to Add AM/PM to a Time or Datetime Value in MariaDB

MariaDB includes many functions that allow you to return time and datetime values in a variety of formats.

Two functions allow you to format the time portion using a 12 hour clock, with the AM/PM designator are DATE_FORMAT() and TIME_FORMAT().

There are many format specifiers that can be used with these functions, but only a couple that return the AM/PM designator.

The %r Format Specifier

The %r format specifier is used to format the time in 12 hour format, followed by the AM/PM designator.

Example:

SELECT DATE_FORMAT('2030-03-10 18:10:37', '%r');

Result:

+------------------------------------------+
| DATE_FORMAT('2030-03-10 18:10:37', '%r') |
+------------------------------------------+
| 06:10:37 PM                              |
+------------------------------------------+

The resulting time is displayed as if it had been formatted using the following format string: '%I:%i:%S %p'.

Obviously, whether it returns AM or PM depends on the actual time. Times before 12:00:00 return AM and times after that return PM.

Here’s what happens if we change the time to come before 12:00:00:

SELECT DATE_FORMAT('2030-03-10 06:10:37', '%r');

Result:

+------------------------------------------+
| DATE_FORMAT('2030-03-10 06:10:37', '%r') |
+------------------------------------------+
| 06:10:37 AM                              |
+------------------------------------------+

Both DATE_FORMAT() and TIME_FORMAT() accept the %r format specifier, so we can use the same format specifier with the TIME_FORMAT() function:

SELECT TIME_FORMAT('06:10:37', '%r');

Result:

+-------------------------------+
| TIME_FORMAT('06:10:37', '%r') |
+-------------------------------+
| 06:10:37 AM                   |
+-------------------------------+

TIME_FORMAT() accepts time values as well as datetime values, whereas DATE_FORMAT() only accepts date and datetime values. However, TIME_FORMAT() only accepts format specifiers for hours minutes and seconds. Seeing as %r returns hours, minutes and seconds, this is accepted too.

The %p Format Specifier

The %p format specifier is a more specific format specifier that is used solely to represent the AM/PM designator. It is normally used in conjunction with other format specifiers to return the time in a custom format.

As mentioned, the %r format specifier formats the time as if it had been formatted using the following format string: '%I:%i:%S %p'.

Let’s use that string explicitly:

SELECT TIME_FORMAT('18:10:37', '%I:%i:%S %p');

Result:

+----------------------------------------+
| TIME_FORMAT('18:10:37', '%I:%i:%S %p') |
+----------------------------------------+
| 06:10:37 PM                            |
+----------------------------------------+

So we get the same result as when using the %r format specifier.

However, one benefit of using this method is that we can construct the output in our own custom way.

For example:

SELECT TIME_FORMAT('18:10:37', '%l:%i %p');

Result:

+-------------------------------------+
| TIME_FORMAT('18:10:37', '%l:%i %p') |
+-------------------------------------+
| 6:10 PM                             |
+-------------------------------------+

Here, we used %l to return the hour portion without the leading zero. We also omitted the seconds portion of the time.

See MariaDB Format Strings for a full list of format specifiers that can be used with these functions.