Decomposing Dates or Times Using Component-Extraction Functions
5.6.1 Problem
You want to obtain just a part of a date or a time.
5.6.2 Solution
Invoke a function specifically intended for extracting part of a temporal value, such as MONTH( ) or MINUTE( ). For obtaining single components of temporal values, these functions are faster than using DATE_FORMAT( ) for the equivalent operation.
5.6.3 Discussion
MySQL includes many functions for extracting date or time parts from temporal values. Some of these are shown in the following list; consult the MySQL Reference Manual for a complete list. The date-related functions work with DATE, DATETIME, or TIMESTAMP values. The time-related functions work with TIME, DATETIME, or TIMESTAMP values.
Function |
Return Value |
---|---|
YEAR( ) |
Year of date |
MONTH( ) |
Month number (1..12) |
MONTHNAME( ) |
Month name (January..December) |
DAYOFMONTH( ) |
Day of month (1..31) |
DAYNAME( ) |
Day of week (Sunday..Saturday) |
DAYOFWEEK( ) |
Day of week (1..7 for Sunday..Saturday) |
WEEKDAY( ) |
Day of week (0..6 for Monday..Sunday) |
DAYOFYEAR( ) |
Day of year (1..366) |
HOUR( ) |
Hour of time (0..23) |
MINUTE( ) |
Minute of time (0..59) |
SECOND( ) |
Second of time (0..59) |
Here's an example:
mysql> SELECT dt, -> YEAR(dt), DAYOFMONTH(dt), -> HOUR(dt), SECOND(dt) -> FROM datetime_val; +---------------------+----------+----------------+----------+------------+ | dt | YEAR(dt) | DAYOFMONTH(dt) | HOUR(dt) | SECOND(dt) | +---------------------+----------+----------------+----------+------------+ | 1970-01-01 00:00:00 | 1970 | 1 | 0 | 0 | | 1987-03-05 12:30:15 | 1987 | 5 | 12 | 15 | | 1999-12-31 09:00:00 | 1999 | 31 | 9 | 0 | | 2000-06-04 15:45:30 | 2000 | 4 | 15 | 30 | +---------------------+----------+----------------+----------+------------+
Functions such as YEAR( ) or DAYOFMONTH( ) extract values that have an obvious correspondence to a substring of date values. Some date extraction functions provide access to values that have no such correspondence. One is the day-of-year value:
mysql> SELECT d, DAYOFYEAR(d) FROM date_val; +------------+--------------+ | d | DAYOFYEAR(d) | +------------+--------------+ | 1864-02-28 | 59 | | 1900-01-15 | 15 | | 1987-03-05 | 64 | | 1999-12-31 | 365 | | 2000-06-04 | 156 | +------------+--------------+
Another is the day of the week, which can be obtained either by name or by number:
- DAYNAME( ) returns the complete day name. There is no function for returning the three-character name abbreviation, but you can get it easily by passing the full name to LEFT( ):
mysql> SELECT d, DAYNAME(d), LEFT(DAYNAME(d),3) FROM date_val; +------------+------------+--------------------+ | d | DAYNAME(d) | LEFT(DAYNAME(d),3) | +------------+------------+--------------------+ | 1864-02-28 | Sunday | Sun | | 1900-01-15 | Monday | Mon | | 1987-03-05 | Thursday | Thu | | 1999-12-31 | Friday | Fri | | 2000-06-04 | Sunday | Sun | +------------+------------+--------------------+
- To get the day of the week as a number, use DAYOFWEEK( ) or WEEKDAY( )but pay attention to the range of values each function returns. DAYOFWEEK( ) returns values from 1 to 7, corresponding to Sunday through Saturday. WEEKDAY( ) returns values from 0 to 6, corresponding to Monday through Sunday.
mysql> SELECT d, DAYNAME(d), DAYOFWEEK(d), WEEKDAY(d) FROM date_val; +------------+------------+--------------+------------+ | d | DAYNAME(d) | DAYOFWEEK(d) | WEEKDAY(d) | +------------+------------+--------------+------------+ | 1864-02-28 | Sunday | 1 | 6 | | 1900-01-15 | Monday | 2 | 0 | | 1987-03-05 | Thursday | 5 | 3 | | 1999-12-31 | Friday | 6 | 4 | | 2000-06-04 | Sunday | 1 | 6 | +------------+------------+--------------+------------+
Another way to obtain individual parts of temporal values is to use the EXTRACT( ) function:
mysql> SELECT dt, -> EXTRACT(DAY FROM dt), -> EXTRACT(HOUR FROM dt) -> FROM datetime_val; +---------------------+----------------------+-----------------------+ | dt | EXTRACT(DAY FROM dt) | EXTRACT(HOUR FROM dt) | +---------------------+----------------------+-----------------------+ | 1970-01-01 00:00:00 | 1 | 0 | | 1987-03-05 12:30:15 | 5 | 12 | | 1999-12-31 09:00:00 | 31 | 9 | | 2000-06-04 15:45:30 | 4 | 15 | +---------------------+----------------------+-----------------------+
The keyword indicating what to extract should be a unit specifier such as YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND. The EXTRACT( ) function is available as of MySQL 3.23.0.
5.6.4 See Also
The functions discussed in this recipe provide single components of temporal values. If you want to produce a value consisting of multiple components from a given value, it may be more convenient to use DATE_FORMAT( ). See Recipe 5.5.