Last time we looked at a few of the more commonly used date and time functions. This time we’re going to look at some of the less well-known functions. First, we will need to understand the various date and time types MySQL accepts for passing to many of these functions.
SECOND | ss |
MINUTE | mm |
HOUR | hh |
DAY | DD |
MONTH | MM |
YEAR | YY |
MINUTE_SECOND | mm:ss |
HOUR_MINUTE | hh:mm |
DAY_HOUR | DD:hh |
YEAR_MONTH | YYYY-MM |
HOUR_SECOND | hh:ss |
DAY_MINUTE | DD hh:mm |
DAY_SECOND | DD hh:mm:ss |
As you can see, there are quite a few. Notice that the ones spanning a number of time elements (such as DAY_SECOND) include all the elements between DAY and SECOND (in this case HOUR and MINUTE). In the last article, we looked at a specific date calculation to determine age. However, there’s a lot more you can do in MySQL before you need to call upon a programming language for assistance.
Adding and subtracting dates and times with DATE_ADD() and DATE_SUB()
The DATE_ADD() function – ADDDATE() is a synonmym – is used to add a particular date or time interval to a give date or time.
DATE_ADD(datetime, INTERVAL expression datetimetype)
For example, to find a date 14 days after the 13th July, 2003, you can use:
mysql> SELECT DATE_ADD('2003-07-13', INTERVAL 14 DAY); +-----------------------------------------+ | DATE_ADD('2003-07-13', INTERVAL 14 DAY) | +-----------------------------------------+ | 2003-07-27 | +-----------------------------------------+
You can also use a negative expression to subtract datetimes. To find the datetime 22 hours and 14 minutes before the the 13th July, 2003, 1 minute and 1 second past 1, you can use:
mysql> SELECT DATE_ADD('2003-07-13 01:01:01', INTERVAL -'22:14' HOUR_MINUTE); +----------------------------------------------------------------+ | DATE_ADD('2003-07-13 01:01:01', INTERVAL -'22:14' HOUR_MINUTE) | +----------------------------------------------------------------+ | 2003-07-13 00:39:01 | +----------------------------------------------------------------+
Note that when using a datetime type that requires more than a simple numeric, you need to use quotes to contain the entire expression.
You can also mix date and time types, and MySQL will do its best to make do. For example:
mysql> SELECT DATE_ADD('2003-07-13', INTERVAL -1 MINUTE); +--------------------------------------------+ | DATE_ADD('2003-07-13', INTERVAL -1 MINUTE) | +--------------------------------------------+ | 2003-07-12 23:59:00 | +--------------------------------------------+
or
mysql> SELECT DATE_ADD('2003-07-13', INTERVAL '-22:14' HOUR_MINUTE); +-------------------------------------------------------+ | DATE_ADD('2003-07-13', INTERVAL '-22:14' HOUR_MINUTE) | +-------------------------------------------------------+ | 2003-07-12 01:46:00 | +-------------------------------------------------------+
Be careful about where you put the minus sign. When you use quotes, and place the minus sign outside of the quotes, you may not get what you expect. Here’s the same example with the minus sign moved:
mysql> SELECT DATE_ADD('2003-07-14', INTERVAL -'22:14' HOUR_MINUTE); +-------------------------------------------------------+ | DATE_ADD('2003-07-14', INTERVAL -'22:14' HOUR_MINUTE) | +-------------------------------------------------------+ | 2003-07-13 23:38:00 | +-------------------------------------------------------+
Probably not what you were looking for!
There’s an alternative to using a negative number with the DATE_ADD() function – you could simply use DATE_SUB(), or its synonym SUBDATE(). There is also an alternative if you’re only worried about the YEAR and MONTH components of the date. You can use the PERIOD_ADD() and PERIOD_DIFF() functions. PERIOD_ADD takes a period (specified as YYYYMM or YYMM), and adds a number of months
PERIOD_ADD(period,months)
For example:
mysql> SELECT PERIOD_ADD(200312,43); +-----------------------+ | PERIOD_ADD(200312,43) | +-----------------------+ | 200707 | +-----------------------+
As always, you can use a negative to subtract, as the next example shows (note the two-digit year).
mysql> SELECT PERIOD_ADD(0312,-32); +----------------------+ | PERIOD_ADD(0312,-32) | +----------------------+ | 200104 | +----------------------+
Conversely, the PERIOD_DIFF function returns the difference, in months, between two periods. Again, the periods can be specified as both YYYYMM and YYMM.
PERIOD_DIFF(period,period)
For example:
mysql> SELECT PERIOD_DIFF(200104,0312); +--------------------------+ | PERIOD_DIFF(200104,0312) | +--------------------------+ | -32 | +--------------------------+