摘要:MySQL中的常用日期和时间函数介绍及实测。
日期和时间函数与字符串函数、数值函数是使用频率最高的三大类函数,今天我们就来看看它。下表是MySQL 5.7中支持的日期和时间函数。
Name | Description |
---|---|
ADDDATE() | Add time values (intervals) to a date value |
ADDTIME() | Add time |
CONVERT_TZ() | Convert from one time zone to another |
CURDATE() | Return the current date |
CURRENT_DATE(), CURRENT_DATE | Synonyms for CURDATE() |
CURRENT_TIME(), CURRENT_TIME | Synonyms for CURTIME() |
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP | Synonyms for NOW() |
CURTIME() | Return the current time |
DATE() | Extract the date part of a date or datetime expression |
DATE_ADD() | Add time values (intervals) to a date value |
DATE_FORMAT() | Format date as specified |
DATE_SUB() | Subtract a time value (interval) from a date |
DATEDIFF() | Subtract two dates |
DAY() | Synonym for DAYOFMONTH() |
DAYNAME() | Return the name of the weekday |
DAYOFMONTH() | Return the day of the month (0-31) |
DAYOFWEEK() | Return the weekday index of the argument |
DAYOFYEAR() | Return the day of the year (1-366) |
EXTRACT() | Extract part of a date |
FROM_DAYS() | Convert a day number to a date |
FROM_UNIXTIME() | Format Unix timestamp as a date |
GET_FORMAT() | Return a date format string |
HOUR() | Extract the hour |
LAST_DAY | Return the last day of the month for the argument |
LOCALTIME(), LOCALTIME | Synonym for NOW() |
LOCALTIMESTAMP, LOCALTIMESTAMP() | Synonym for NOW() |
MAKEDATE() | Create a date from the year and day of year |
MAKETIME() | Create time from hour, minute, second |
MICROSECOND() | Return the microseconds from argument |
MINUTE() | Return the minute from the argument |
MONTH() | Return the month from the date passed |
MONTHNAME() | Return the name of the month |
NOW() | Return the current date and time |
PERIOD_ADD() | Add a period to a year-month |
PERIOD_DIFF() | Return the number of months between periods |
QUARTER() | Return the quarter from a date argument |
SEC_TO_TIME() | Converts seconds to ‘hh:mm:ss’ format |
SECOND() | Return the second (0-59) |
STR_TO_DATE() | Convert a string to a date |
SUBDATE() | Synonym for DATE_SUB() when invoked with three arguments |
SUBTIME() | Subtract times |
SYSDATE() | Return the time at which the function executes |
TIME() | Extract the time portion of the expression passed |
TIME_FORMAT() | Format as time |
TIME_TO_SEC() | Return the argument converted to seconds |
TIMEDIFF() | Subtract time |
TIMESTAMP() | With a single argument, this function returns the date or datetime expression; with two arguments, the sum of the arguments |
TIMESTAMPADD() | Add an interval to a datetime expression |
TIMESTAMPDIFF() | Subtract an interval from a datetime expression |
TO_DAYS() | Return the date argument converted to days |
TO_SECONDS() | Return the date or datetime argument converted to seconds since Year 0 |
UNIX_TIMESTAMP() | Return a Unix timestamp |
UTC_DATE() | Return the current UTC date |
UTC_TIME() | Return the current UTC time |
UTC_TIMESTAMP() | Return the current UTC date and time |
WEEK() | Return the week number |
WEEKDAY() | Return the weekday index |
WEEKOFYEAR() | Return the calendar week of the date (1-53) |
YEAR() | Return the year |
YEARWEEK() | Return the year and week |
我们通过实例来研究下常用函数的用法。
- CURDATE(),返回当前日期,只包含年月日
root@database-one 12:34: [gftest]> SELECT CURDATE(),CURDATE()+0,CURDATE()+1,CURDATE()+2; +------------+-------------+-------------+-------------+ | CURDATE() | CURDATE()+0 | CURDATE()+1 | CURDATE()+2 | +------------+-------------+-------------+-------------+ | 2020-02-23 | 20200223 | 20200224 | 20200225 | +------------+-------------+-------------+-------------+ 1 row in set (0.10 sec)
可以看到,CURDATE()的返回值格式是’YYYY-MM-DD’ 或 YYYYMMDD,取决于你要进行的后续操作类型。
- CURTIME([fsp]),返回当前时间,只包含时分秒
可选参数fsp,指定从0到6的小数秒精度。
root@database-one 12:40: [gftest]> select curtime(),curtime()+0,curtime(2)+1,curtime(6)+2; +-----------+-------------+--------------+---------------+ | curtime() | curtime()+0 | curtime(2)+1 | curtime(6)+2 | +-----------+-------------+--------------+---------------+ | 12:41:43 | 124143 | 124144.93 | 124145.938067 | +-----------+-------------+--------------+---------------+ 1 row in set (0.05 sec)
- NOW([fsp]),返回当前的日期和时间,年月日时分秒全包含
可选参数fsp,指定从0到6的小数秒精度。
root@database-one 12:47: [gftest]> select now(),now()+0,now(2)+1,now(6)+2; +---------------------+----------------+-------------------+-----------------------+ | now() | now()+0 | now(2)+1 | now(6)+2 | +---------------------+----------------+-------------------+-----------------------+ | 2020-02-23 12:48:21 | 20200223124821 | 20200223124822.55 | 20200223124823.551110 | +---------------------+----------------+-------------------+-----------------------+ 1 row in set (0.02 sec)
MySQL也支持SYSDATE(),但它和NOW()是有区别的,看个列子:
root@database-one 12:53: [gftest]> select now(),sleep(2),now(); +---------------------+----------+---------------------+ | now() | sleep(2) | now() | +---------------------+----------+---------------------+ | 2020-02-23 12:53:44 | 0 | 2020-02-23 12:53:44 | +---------------------+----------+---------------------+ 1 row in set (2.03 sec) root@database-one 12:53: [gftest]> select sysdate(),sleep(2),sysdate(); +---------------------+----------+---------------------+ | sysdate() | sleep(2) | sysdate() | +---------------------+----------+---------------------+ | 2020-02-23 12:54:01 | 0 | 2020-02-23 12:54:03 | +---------------------+----------+---------------------+ 1 row in set (2.05 sec) root@database-one 12:54: [gftest]> select now(),sleep(2),sysdate(); +---------------------+----------+---------------------+ | now() | sleep(2) | sysdate() | +---------------------+----------+---------------------+ | 2020-02-23 12:55:30 | 0 | 2020-02-23 12:55:32 | +---------------------+----------+---------------------+ 1 row in set (2.00 sec) root@database-one 12:55: [gftest]> select sysdate(),sleep(2),now(); +---------------------+----------+---------------------+ | sysdate() | sleep(2) | now() | +---------------------+----------+---------------------+ | 2020-02-23 12:55:44 | 0 | 2020-02-23 12:55:44 | +---------------------+----------+---------------------+ 1 row in set (2.00 sec)
可以看到,NOW()返回语句开始执行的时间(在函数或触发器中,NOW()返回函数或触发器语句开始执行)。SYSDATE()返回它自己被执行的时间。
- UNIX_TIMESTAMP([date]),返回日期date的UNIX时间戳
这个时间戳怎么理解呢?如果调用UNIX_TIMESTAMP()时没有日期参数,则返回从UTC时间’1970-01-01 00:00:00’开始到当前时间的秒数。如果用日期参数调用UNIX_TIMESTAMP(),则返回从UTC时间’1970-01-01 00:00:00’开始到参数的秒数。
[date]参数可以是DATE、DATETIME或TIMESTAMP字符串,也可以是YYMMDD、YYMMDDHHMMSS、YYYYMMDDDDDD或YYYYMMDDHHMMSS格式的数字。如果参数包含时间部分,则可以选择包含小数秒部分。
root@database-one 13:12: [gftest]> SELECT UNIX_TIMESTAMP(),UNIX_TIMESTAMP('2015-11-13 10:20:19'),UNIX_TIMESTAMP('2015-11-13 10:20:19.012'); +------------------+---------------------------------------+-------------------------------------------+ | UNIX_TIMESTAMP() | UNIX_TIMESTAMP('2015-11-13 10:20:19') | UNIX_TIMESTAMP('2015-11-13 10:20:19.012') | +------------------+---------------------------------------+-------------------------------------------+ | 1582434736 | 1447381219 | 1447381219.012 | +------------------+---------------------------------------+-------------------------------------------+ 1 row in set (0.02 sec)
- FROM_UNIXTIME(unix_timestamp[,format]),返回时间戳参数的日期值,和UNIX_TIMESTAMP()互为逆操作
root@database-one 13:14: [gftest]> select from_unixtime(1582434736),from_unixtime(1447381219),from_unixtime(1447381219.012); +---------------------------+---------------------------+-------------------------------+ | from_unixtime(1582434736) | from_unixtime(1447381219) | from_unixtime(1447381219.012) | +---------------------------+---------------------------+-------------------------------+ | 2020-02-23 13:12:16 | 2015-11-13 10:20:19 | 2015-11-13 10:20:19.012 | +---------------------------+---------------------------+-------------------------------+ 1 row in set (0.04 sec)
- YEAR(date),MONTH(date),DAY(date),HOUR(time),MINUTE(time),SECOND(time),分别返回时间参数的年、月、日、时、分、秒各部分
root@database-one 13:28: [gftest]> select now(),YEAR(now()),MONTH(now()),DAY(now()),HOUR(now()),MINUTE(now()),SECOND(now()); +---------------------+-------------+--------------+------------+-------------+---------------+---------------+ | now() | YEAR(now()) | MONTH(now()) | DAY(now()) | HOUR(now()) | MINUTE(now()) | SECOND(now()) | +---------------------+-------------+--------------+------------+-------------+---------------+---------------+ | 2020-02-23 13:28:17 | 2020 | 2 | 23 | 13 | 28 | 17 | +---------------------+-------------+--------------+------------+-------------+---------------+---------------+ 1 row in set (0.06 sec)
- MONTHNAME(date),返回参数的英文月份名称
root@database-one 13:29: [gftest]> select now(),monthname(now()); +---------------------+------------------+ | now() | monthname(now()) | +---------------------+------------------+ | 2020-02-23 13:30:05 | February | +---------------------+------------------+ 1 row in set (0.10 sec)
- DATE_FORMAT(date,format),按字符串format格式化日期date值
MySQL5.7中可以用到的格式符如下表:
Specifier | Description |
---|---|
%a | Abbreviated weekday name (Sun…Sat) |
%b | Abbreviated month name (Jan…Dec) |
%c | Month, numeric (0…12) |
%D | Day of the month with English suffix (0th, 1st, 2nd, 3rd, …) |
%d | Day of the month, numeric (00…31) |
%e | Day of the month, numeric (0…31) |
%f | Microseconds (000000…999999) |
%H | Hour (00…23) |
%h和%I | Hour (01…12) |
%i | Minutes, numeric (00…59) |
%j | Day of year (001…366) |
%k | Hour (0…23) |
%l | Hour (1…12) |
%M | Month name (January…December) |
%m | Month, numeric (00…12) |
%p | AM or PM |
%r | Time, 12-hour (hh:mm:ss followed by AM or PM) |
%S和%s | Seconds (00…59) |
%T | Time, 24-hour (hh:mm:ss) |
%U | Week (00…53), where Sunday is the first day of the week; WEEK() mode 0 |
%u | Week (00…53), where Monday is the first day of the week; WEEK() mode 1 |
%V | Week (01…53), where Sunday is the first day of the week; WEEK() mode 2; used with %X |
%v | Week (01…53), where Monday is the first day of the week; WEEK() mode 3; used with %x |
%W | Weekday name (Sunday…Saturday) |
%w | Day of the week (0=Sunday…6=Saturday) |
%X | Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V |
%x | Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v |
%Y | Year, numeric, four digits |
%y | Year, numeric (two digits) |
%% | A literal % character |
%x | x, for any “x” not listed above |
root@database-one 13:52: [gftest]> select now(),date_format(now(),'%M,%D,%Y'); +---------------------+-------------------------------+ | now() | date_format(now(),'%M,%D,%Y') | +---------------------+-------------------------------+ | 2020-02-23 13:52:48 | February,23rd,2020 | +---------------------+-------------------------------+ 1 row in set (0.05 sec) root@database-one 13:52: [gftest]> SELECT DATE_FORMAT('2006-06-00', '%d'); +---------------------------------+ | DATE_FORMAT('2006-06-00', '%d') | +---------------------------------+ | 00 | +---------------------------------+ 1 row in set (0.08 sec)
- DATE_ADD(date,INTERVAL expr unit),返回与所给日期相差INTERVAL时段的日期
INTERVAL是关键字,unit是真正的间隔类型,在MySQL5.7中提供了20种间隔类型(详见下表),expr是按照间隔类型格式书写的表达式。
unit Value | Expected expr Format |
---|---|
MICROSECOND | MICROSECONDS |
SECOND | SECONDS |
MINUTE | MINUTES |
HOUR | HOURS |
DAY | DAYS |
WEEK | WEEKS |
MONTH | MONTHS |
QUARTER | QUARTERS |
YEAR | YEARS |
SECOND_MICROSECOND | ‘SECONDS.MICROSECONDS’ |
MINUTE_MICROSECOND | ‘MINUTES:SECONDS.MICROSECONDS’ |
MINUTE_SECOND | ‘MINUTES:SECONDS’ |
HOUR_MICROSECOND | ‘HOURS:MINUTES:SECONDS.MICROSECONDS’ |
HOUR_SECOND | ‘HOURS:MINUTES:SECONDS’ |
HOUR_MINUTE | ‘HOURS:MINUTES’ |
DAY_MICROSECOND | ‘DAYS HOURS:MINUTES:SECONDS.MICROSECONDS’ |
DAY_SECOND | ‘DAYS HOURS:MINUTES:SECONDS’ |
DAY_MINUTE | ‘DAYS HOURS:MINUTES’ |
DAY_HOUR | ‘DAYS HOURS’ |
YEAR_MONTH | ‘YEARS-MONTHS’ |
root@database-one 14:11: [gftest]> select now(),date_add(now(),interval 20 day),date_add(now(),interval 3 month),date_add(now(),interval '1_2' year_month); +---------------------+---------------------------------+----------------------------------+-------------------------------------------+ | now() | date_add(now(),interval 20 day) | date_add(now(),interval 3 month) | date_add(now(),interval '1_2' year_month) | +---------------------+---------------------------------+----------------------------------+-------------------------------------------+ | 2020-02-23 14:12:03 | 2020-03-14 14:12:03 | 2020-05-23 14:12:03 | 2021-04-23 14:12:03 | +---------------------+---------------------------------+----------------------------------+-------------------------------------------+ 1 row in set (0.00 sec)
也可以使用负数返回过去的某个日期时间。
root@database-one 14:14: [gftest]> select now(),date_add(now(),interval -20 day),date_add(now(),interval -3 month),date_add(now(),interval '-1_-2' year_month); +---------------------+----------------------------------+-----------------------------------+---------------------------------------------+ | now() | date_add(now(),interval -20 day) | date_add(now(),interval -3 month) | date_add(now(),interval '-1_-2' year_month) | +---------------------+----------------------------------+-----------------------------------+---------------------------------------------+ | 2020-02-23 14:15:22 | 2020-02-03 14:15:22 | 2019-11-23 14:15:22 | 2018-12-23 14:15:22 | +---------------------+----------------------------------+-----------------------------------+---------------------------------------------+ 1 row in set (0.01 sec)
- DATEDIFF(expr1,expr2),返回两个日期之间相差的天数
root@database-one 14:17: [gftest]> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30'); +----------------------------------------------+ | DATEDIFF('2007-12-31 23:59:59','2007-12-30') | +----------------------------------------------+ | 1 | +----------------------------------------------+ 1 row in set (0.05 sec) root@database-one 14:17: [gftest]> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30 12:08:03'); +-------------------------------------------------------+ | DATEDIFF('2007-12-31 23:59:59','2007-12-30 12:08:03') | +-------------------------------------------------------+ | 1 | +-------------------------------------------------------+ 1 row in set (0.04 sec)
从上面可以看到,只有参数的日期部分参与计算。
© 2020, morinson. 版权所有. 欢迎转载,但请保留作者及出处。