MySQL常用日期时间函数小结

备注:测试数据库版本为MySQL 8.0

这个blog我们来聊聊常见的日期时间函数

mysql的日期时间函数比oracle更丰富,内容也更多,从oracle转过来的多少有些不熟悉,需要慢慢的练习

函数名函数用途
ADDDATE()增加日期间隔,默认为天,功能和语法与DATE_ADD()/DATE_SUB()/SUBDATE()类似
ADDTIME()增加时间间隔
CURDATE()返回当前日期,同义词CURRENT_DATE(), CURRENT_DATE
CURTIME()返回当前时间,同义词CURRENT_TIME(), CURRENT_TIME
NOW()返回当前日期和时间,同义词CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP LOCALTIME(), LOCALTIME LOCALTIMESTAMP, LOCALTIMESTAMP()
DATE()从日期时间类型中截取日期
DATE_FORMAT()格式日期指定
DATEDIFF()返回两个日期间隔的天数
DAYNAME()返回日期的星期英文,例如:‘Saturday’
DAYOFMONTH()返回指定日期当月的天数, 同义词DAY()
DAYOFWEEK()返回星期几,数值类型,1-7
DAYOFYEAR()返回今天是当年的第几天
EXTRACT()提取日期的部分
FROM_DAYS()与to_days()结合使用,数值转换成日期
FROM_UNIXTIME()与UNIX_TIMESTAMP()结合使用,数值转换成日期时间类型
GET_FORMAT()返回日期格式的字符串
HOUR()提取小时
LAST_DAY返回当月最后一天
MAKEDATE()根据年份及当年的天数,返回日期
MAKETIME()根据时分秒,返回时间
MICROSECOND()从表达式中返回微妙
MINUTE()从时间中返回分钟
MONTH()从日期中返回月份-数值
MONTHNAME()从时间类型中返回月份-英文
PERIOD_ADD()给年月类型增加月份
PERIOD_DIFF()返回两个年月间隔的月份
QUARTER()返回年份中的季度 取值1-4
SEC_TO_TIME()将数值类型的秒转换为时分秒
SECOND()返回时间中的秒
STR_TO_DATE()将字符串转为日期时间格式
SUBTIME()SUBTIME(expr1,expr2) 返回expr1和expr2的差
SYSDATE()返回当前时间
TIME()返回日期时间格式中的时间
TIME_FORMAT()指定时间格式
TIME_TO_SEC()将时间类型转换为秒,与SEC_TO_TIME相反
TIMEDIFF()返回两个时间的差,结果为时间类型
TIMESTAMP()返回日期时间类型值
TIMESTAMPADD()日期时间类型增加间隔
TIMESTAMPDIFF()求两个日期时间的间隔
TO_DAYS()返回日期对应的天数,0000-00-01为第一天
TO_SECONDS()返回日期对应的秒,0000-00-00 00:00:01为第一秒
UNIX_TIMESTAMP()将时间转成数字,与FROM_UNIXTIME相互对应
WEEK()返回本年的星期数
WEEKDAY()返回数值的星期数
WEEKOFYEAR()返回本年的星期数
YEAR()返回年份
YEARWEEK()返回星期数

1.ADDDATE

语法:ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)
用于给时间类型增加时间间隔,默认为天

--通过interval增加
mysql> SELECT ADDDATE('2020-01-01', INTERVAL 31 DAY);
+----------------------------------------+
| ADDDATE('2020-01-01', INTERVAL 31 DAY) |
+----------------------------------------+
| 2020-02-01                             |
+----------------------------------------+
1 row in set (0.00 sec)
--直接通过数字进行增加
mysql> SELECT ADDDATE('2020-01-01',31);
+--------------------------+
| ADDDATE('2020-01-01',31) |
+--------------------------+
| 2020-02-01               |
+--------------------------+
1 row in set (0.00 sec)
--有时分秒的也可以进行增加
mysql> SELECT ADDDATE('2020-01-01 09:00:00',31);
+-----------------------------------+
| ADDDATE('2020-01-01 09:00:00',31) |
+-----------------------------------+
| 2020-02-01 09:00:00               |
+-----------------------------------+
1 row in set (0.00 sec)
--增加1年
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL 1 YEAR);
+------------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL 1 YEAR) |
+------------------------------------------------+
| 2021-01-01 09:00:00                            |
+------------------------------------------------+
1 row in set (0.00 sec)
--增加1月
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL 1 MONTH);
+-------------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL 1 MONTH) |
+-------------------------------------------------+
| 2020-02-01 09:00:00                             |
+-------------------------------------------------+
1 row in set (0.00 sec)
--增加1天
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL 1 DAY);
+-----------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL 1 DAY) |
+-----------------------------------------------+
| 2020-01-02 09:00:00                           |
+-----------------------------------------------+
1 row in set (0.00 sec)
--增加1小时
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL 1 DAY_HOUR);
+----------------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL 1 DAY_HOUR) |
+----------------------------------------------------+
| 2020-01-01 10:00:00                                |
+----------------------------------------------------+
1 row in set (0.00 sec)
--增加1分钟
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL 1 MINUTE);
+--------------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL 1 MINUTE) |
+--------------------------------------------------+
| 2020-01-01 09:01:00                              |
+--------------------------------------------------+
1 row in set (0.00 sec)
--增加1秒
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL 1 DAY_SECOND);
+------------------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL 1 DAY_SECOND) |
+------------------------------------------------------+
| 2020-01-01 09:00:01                                  |
+------------------------------------------------------+
1 row in set (0.00 sec)
--增加1分1秒
mysql> SELECT ADDDATE('2020-01-01 09:00:00',INTERVAL '1:1' MINUTE_SECOND);
+-------------------------------------------------------------+
| ADDDATE('2020-01-01 09:00:00',INTERVAL '1:1' MINUTE_SECOND) |
+-------------------------------------------------------------+
| 2020-01-01 09:01:01                                         |
+-------------------------------------------------------------+
1 row in set (0.00 sec)

2.ADDTIME

语法:ADDTIME(expr1,expr2)
给日期列增加一个时间,可以是天/时/分/秒/微妙

--增加1小时、30分、10秒
mysql> SELECT ADDTIME('2020-01-01 09:00:00','01:30:10');
+-------------------------------------------+
| ADDTIME('2020-01-01 09:00:00','01:30:10') |
+-------------------------------------------+
| 2020-01-01 10:30:10                       |
+-------------------------------------------+
1 row in set (0.00 sec)
--增加1天、1小时、30分、10秒
mysql> SELECT ADDTIME('2020-01-01 09:00:00','1 01:30:10');
+---------------------------------------------+
| ADDTIME('2020-01-01 09:00:00','1 01:30:10') |
+---------------------------------------------+
| 2020-01-02 10:30:10                         |
+---------------------------------------------+
1 row in set (0.00 sec)
--如果刚好是月底,增加1天后,会自动跳到下个月
mysql> SELECT ADDTIME('2020-01-31 09:00:00','1 01:30:10');
+---------------------------------------------+
| ADDTIME('2020-01-31 09:00:00','1 01:30:10') |
+---------------------------------------------+
| 2020-02-01 10:30:10                         |
+---------------------------------------------+
1 row in set (0.00 sec)
--给时间加上50天
mysql> SELECT ADDTIME('2020-01-31 09:00:00','50 01:30:10');
+----------------------------------------------+
| ADDTIME('2020-01-31 09:00:00','50 01:30:10') |
+----------------------------------------------+
| 2020-03-06 07:59:59                          |
+----------------------------------------------+
1 row in set, 1 warning (0.00 sec)
--给时间加上1秒2微妙
mysql> SELECT ADDTIME('2020-01-31 09:00:00.999999','0:0:1.000002');
+------------------------------------------------------+
| ADDTIME('2020-01-31 09:00:00.999999','0:0:1.000002') |
+------------------------------------------------------+
| 2020-01-31 09:00:02.000001                           |
+------------------------------------------------------+
1 row in set (0.00 sec)

3.CURDATE()

返回一个’YYYY-MM-DD’ 或者 YYYYMMDD 格式的日期

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2020-05-22 |
+------------+
1 row in set (0.00 sec)

mysql> select curdate()+0;
+-------------+
| curdate()+0 |
+-------------+
|    20200522 |
+-------------+
1 row in set (0.00 sec)

4.CURTIME()

返回’hh:mm:ss’ 或 hhmmss 格式时间

mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 15:29:27  |
+-----------+
1 row in set (0.00 sec)

mysql> select curtime()+0;
+-------------+
| curtime()+0 |
+-------------+
|      152930 |
+-------------+
1 row in set (0.00 sec)

5.NOW()

返回当前日期和时间,返回格式 ‘YYYY-MM-DD hh:mm:ss’ 或 YYYYMMDDhhmmss

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-05-22 15:33:27 |
+---------------------+
1 row in set (0.00 sec)

mysql> select now()+0
    -> ;
+----------------+
| now()+0        |
+----------------+
| 20200522153333 |
+----------------+
1 row in set (0.00 sec)

--now()是返回查询开始的时间,即便有sleep也没用
mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2020-05-22 15:34:00 |        0 | 2020-05-22 15:34:00 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)
--sysdate返回的是查询当时的时间
mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2020-05-22 15:34:12 |        0 | 2020-05-22 15:34:14 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)

6.DATE()

从日期时间类型中截取日期类型

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-05-22 15:39:03 |
+---------------------+
1 row in set (0.00 sec)

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2020-05-22  |
+-------------+
1 row in set (0.00 sec)

mysql> select date('2020-05-22 23:59:59');
+-----------------------------+
| date('2020-05-22 23:59:59') |
+-----------------------------+
| 2020-05-22                  |
+-----------------------------+
1 row in set (0.00 sec)

7.DATE_FORMAT()

格式日期指定,真的很丰富

格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位
%%% 字符
%x上述之外的,用x表示

内容太多,我挑几个常用的来练习一下:

mysql> -- 显示年月日时分秒 24小时制
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%Y-%m-%d %H:%i:%s');
+---------------------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%Y-%m-%d %H:%i:%s') |
+---------------------------------------------------------+
| 2020-05-22 13:00:00                                     |
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 显示年月日时分秒 12小时制
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%Y-%m-%d %h:%i:%s %p');
+------------------------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%Y-%m-%d %h:%i:%s %p') |
+------------------------------------------------------------+
| 2020-05-22 01:00:00 PM                                     |
+------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 显示英文月名
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%M');
+------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%M') |
+------------------------------------------+
| May                                      |
+------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 显示英文月名简称
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%b');
+------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%b') |
+------------------------------------------+
| May                                      |
+------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 显示星期英文名
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%W');
+------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%W') |
+------------------------------------------+
| Friday                                   |
+------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 用数值显示今天周几,0代表周日
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%w');
+------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%w') |
+------------------------------------------+
| 5                                        |
+------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 用数值显示今天是本年的第几周,星期一是周的第一天
mysql> SELECT DATE_FORMAT('2020-05-22 13:00:00', '%x-%v');
+---------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00', '%x-%v') |
+---------------------------------------------+
| 2020-21                                     |
+---------------------------------------------+
1 row in set (0.00 sec)

8.DATEDIFF()

返回两个时间间隔的天数
语法:DATEDIFF(expr1,expr2)

--计算2个时间间隔的天数
mysql> select datediff('2020-05-22','2020-05-01');
+-------------------------------------+
| datediff('2020-05-22','2020-05-01') |
+-------------------------------------+
|                                  21 |
+-------------------------------------+
1 row in set (0.00 sec)
--有时分秒的话,都截取了,只比较日期部分
mysql>
mysql> select datediff('2020-05-22','2020-05-01 23:59:59');
+----------------------------------------------+
| datediff('2020-05-22','2020-05-01 23:59:59') |
+----------------------------------------------+
|                                           21 |
+----------------------------------------------+
1 row in set (0.00 sec)

9.dayname()

返回指定日期的星期英文

mysql> select dayname(now());
+----------------+
| dayname(now()) |
+----------------+
| Friday         |
+----------------+
1 row in set (0.00 sec)

10.DAYOFMONTH()

返回指定日期当月的天数,数字类型,返回值1-31

mysql> select DAYOFMONTH('2020-05-22');
+--------------------------+
| DAYOFMONTH('2020-05-22') |
+--------------------------+
|                       22 |
+--------------------------+
1 row in set (0.00 sec)

mysql> select DAYOFMONTH('2020-05-02');
+--------------------------+
| DAYOFMONTH('2020-05-02') |
+--------------------------+
|                        2 |
+--------------------------+
1 row in set (0.00 sec)

11.DAYOFWEEK()

返回星期几,数值类型,1-7
date (1 = Sunday, 2 = Monday, …, 7 = Saturday).

mysql> select DAYOFWEEK('2020-05-22');
+-------------------------+
| DAYOFWEEK('2020-05-22') |
+-------------------------+
|                       6 |
+-------------------------+
1 row in set (0.00 sec)

12.DAYOFYEAR()

返回今天是当年的第几天 (1-366)

mysql> select DAYOFYEAR('2020-05-22');
+-------------------------+
| DAYOFYEAR('2020-05-22') |
+-------------------------+
|                     143 |
+-------------------------+
1 row in set (0.00 sec)

13.EXTRACT()

提取日期的部分
语法:EXTRACT(unit FROM date)

mysql> -- 提取年
mysql> SELECT EXTRACT(YEAR FROM '2020-05-22');
+---------------------------------+
| EXTRACT(YEAR FROM '2020-05-22') |
+---------------------------------+
|                            2020 |
+---------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 提取月
mysql> SELECT EXTRACT(MONTH FROM '2020-05-22');
+----------------------------------+
| EXTRACT(MONTH FROM '2020-05-22') |
+----------------------------------+
|                                5 |
+----------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 提取日
mysql> SELECT EXTRACT(DAY FROM '2020-05-22');
+--------------------------------+
| EXTRACT(DAY FROM '2020-05-22') |
+--------------------------------+
|                             22 |
+--------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 提取小时
mysql> SELECT EXTRACT(HOUR FROM '2020-05-22 13:02:01');
+------------------------------------------+
| EXTRACT(HOUR FROM '2020-05-22 13:02:01') |
+------------------------------------------+
|                                       13 |
+------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 提取分钟
mysql> SELECT EXTRACT(MINUTE FROM '2020-05-22 13:02:01');
+--------------------------------------------+
| EXTRACT(MINUTE FROM '2020-05-22 13:02:01') |
+--------------------------------------------+
|                                          2 |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 提取秒
mysql> SELECT EXTRACT(SECOND FROM '2020-05-22 13:02:01');
+--------------------------------------------+
| EXTRACT(SECOND FROM '2020-05-22 13:02:01') |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 提取毫秒
mysql> SELECT EXTRACT(MICROSECOND FROM '2020-05-22 13:00:00.000123');
+--------------------------------------------------------+
| EXTRACT(MICROSECOND FROM '2020-05-22 13:00:00.000123') |
+--------------------------------------------------------+
|                                                    123 |
+--------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> -- 也可以组合
mysql> SELECT EXTRACT(YEAR_MONTH FROM '2020-05-22');
+---------------------------------------+
| EXTRACT(YEAR_MONTH FROM '2020-05-22') |
+---------------------------------------+
|                                202005 |
+---------------------------------------+
1 row in set (0.00 sec)

14.FROM_DAYS()

与to_days()结合使用,数值转换成日期

mysql> select to_days('2020-05-22');
+-----------------------+
| to_days('2020-05-22') |
+-----------------------+
|                737932 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select from_days(737932);
+-------------------+
| from_days(737932) |
+-------------------+
| 2020-05-22        |
+-------------------+
1 row in set (0.00 sec)

15.FROM_UNIXTIME()

与UNIX_TIMESTAMP()结合使用,数值转换成日期时间类型

mysql> select UNIX_TIMESTAMP('2020-05-22 13:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2020-05-22 13:00:00') |
+---------------------------------------+
|                            1590123600 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select UNIX_TIMESTAMP('2020-05-22');
+------------------------------+
| UNIX_TIMESTAMP('2020-05-22') |
+------------------------------+
|                   1590076800 |
+------------------------------+
1 row in set (0.00 sec)

mysql> select   FROM_UNIXTIME(1590123600);
+---------------------------+
| FROM_UNIXTIME(1590123600) |
+---------------------------+
| 2020-05-22 13:00:00       |
+---------------------------+
1 row in set (0.00 sec)

16.GET_FORMAT()

返回日期格式的字符串

语句格式
GET_FORMAT(DATE,‘USA’)‘%m.%d.%Y’
GET_FORMAT(DATE,‘JIS’)‘%Y-%m-%d’
GET_FORMAT(DATE,‘ISO’)‘%Y-%m-%d’
GET_FORMAT(DATE,‘EUR’)‘%d.%m.%Y’
GET_FORMAT(DATE,‘INTERNAL’)‘%Y%m%d’
GET_FORMAT(DATETIME,‘USA’)‘%Y-%m-%d %H.%i.%s’
GET_FORMAT(DATETIME,‘JIS’)‘%Y-%m-%d %H:%i:%s’
GET_FORMAT(DATETIME,‘ISO’)‘%Y-%m-%d %H:%i:%s’
GET_FORMAT(DATETIME,‘EUR’)‘%Y-%m-%d %H.%i.%s’
GET_FORMAT(DATETIME,‘INTERNAL’)‘%Y%m%d%H%i%s’
GET_FORMAT(TIME,‘USA’)‘%h:%i:%s %p’
GET_FORMAT(TIME,‘JIS’)‘%H:%i:%s’
GET_FORMAT(TIME,‘ISO’)‘%H:%i:%s’
GET_FORMAT(TIME,‘EUR’)‘%H.%i.%s’
GET_FORMAT(TIME,‘INTERNAL’)‘%H%i%s’

需要与DATE_FORMAT函数结合使用,标准输出的话,看起来还蛮方便的

mysql> select DATE_FORMAT('2020-05-22 13:00:00',GET_FORMAT(DATE,'ISO'));
+-----------------------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00',GET_FORMAT(DATE,'ISO')) |
+-----------------------------------------------------------+
| 2020-05-22                                                |
+-----------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> select DATE_FORMAT('2020-05-22 13:00:00',GET_FORMAT(DATETIME,'ISO'));
+---------------------------------------------------------------+
| DATE_FORMAT('2020-05-22 13:00:00',GET_FORMAT(DATETIME,'ISO')) |
+---------------------------------------------------------------+
| 2020-05-22 13:00:00                                           |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

17.HOUR()

提取小时,可以超过23

mysql> SELECT HOUR('10:05:03');
+------------------+
| HOUR('10:05:03') |
+------------------+
|               10 |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT HOUR('272:59:59');
+-------------------+
| HOUR('272:59:59') |
+-------------------+
|               272 |
+-------------------+
1 row in set (0.00 sec)

18.LAST_DAY()

返回当月的最后一天,如果日期错误,返回null

mysql> SELECT LAST_DAY('2020-05-22');
+------------------------+
| LAST_DAY('2020-05-22') |
+------------------------+
| 2020-05-31             |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT LAST_DAY('2020-05-32');
+------------------------+
| LAST_DAY('2020-05-32') |
+------------------------+
| NULL                   |
+------------------------+
1 row in set, 1 warning (0.00 sec)

19.MAKEDATE

根据年份和当年的第几天,返回日期
语法:MAKEDATE(year,dayofyear)

mysql> select makedate(2020,100);
+--------------------+
| makedate(2020,100) |
+--------------------+
| 2020-04-09         |
+--------------------+
1 row in set (0.00 sec)

mysql> select makedate(2020,0);
+------------------+
| makedate(2020,0) |
+------------------+
| NULL             |
+------------------+
1 row in set (0.00 sec)

mysql> select makedate(2020,null);
+---------------------+
| makedate(2020,null) |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

20.MAKETIME

根据时分秒构造时间
语法:MAKETIME(hour,minute,second)

mysql> SELECT MAKETIME(12,15,30);
+--------------------+
| MAKETIME(12,15,30) |
+--------------------+
| 12:15:30           |
+--------------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> SELECT MAKETIME(12,15,0);
+-------------------+
| MAKETIME(12,15,0) |
+-------------------+
| 12:15:00          |
+-------------------+
1 row in set (0.00 sec)

mysql> SELECT MAKETIME(12,15,null);
+----------------------+
| MAKETIME(12,15,null) |
+----------------------+
| NULL                 |
+----------------------+
1 row in set (0.00 sec)

21.MICROSECOND()

从表达式中返回微妙

mysql> SELECT MICROSECOND('12:00:00.123456');
+--------------------------------+
| MICROSECOND('12:00:00.123456') |
+--------------------------------+
|                         123456 |
+--------------------------------+
1 row in set (0.02 sec)

mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010');
+-------------------------------------------+
| MICROSECOND('2019-12-31 23:59:59.000010') |
+-------------------------------------------+
|                                        10 |
+-------------------------------------------+
1 row in set (0.00 sec)

22.MINUTE()

从时间类型中返回分

mysql> SELECT MINUTE('2020-05-22 20:05:03');
+-------------------------------+
| MINUTE('2020-05-22 20:05:03') |
+-------------------------------+
|                             5 |
+-------------------------------+
1 row in set (0.01 sec)

23.MONTH()

从时间类型中返回月份-数值类型

mysql> SELECT MONTH('2020-05-22 20:05:03');
+------------------------------+
| MONTH('2020-05-22 20:05:03') |
+------------------------------+
|                            5 |
+------------------------------+
1 row in set (0.00 sec)

24.MONTHNAME()

从时间类型中返回月份-英文

mysql> SELECT MONTHNAME('2020-05-22 20:05:03');
+----------------------------------+
| MONTHNAME('2020-05-22 20:05:03') |
+----------------------------------+
| May                              |
+----------------------------------+
1 row in set (0.05 sec)

25.PERIOD_ADD()

语法:PERIOD_ADD(P,N)
给P增加N个月份,P的格式YYMM or YYYYMM,返回格式

mysql> select PERIOD_ADD(2005,3);
+--------------------+
| PERIOD_ADD(2005,3) |
+--------------------+
|             202008 |
+--------------------+
1 row in set (0.02 sec)

mysql> select PERIOD_ADD(202005,3);
+----------------------+
| PERIOD_ADD(202005,3) |
+----------------------+
|               202008 |
+----------------------+
1 row in set (0.00 sec)

mysql> select PERIOD_ADD(202005,15);
+-----------------------+
| PERIOD_ADD(202005,15) |
+-----------------------+
|                202108 |
+-----------------------+
1 row in set (0.00 sec)

26.PERIOD_DIFF()

返回两个年月间隔的月份
语法:PERIOD_DIFF(P1,P2)

mysql> select PERIOD_DIFF(202108,202005);
+----------------------------+
| PERIOD_DIFF(202108,202005) |
+----------------------------+
|                         15 |
+----------------------------+
1 row in set (0.02 sec)

mysql> select PERIOD_DIFF(202108,202405);
+----------------------------+
| PERIOD_DIFF(202108,202405) |
+----------------------------+
|                        -33 |
+----------------------------+
1 row in set (0.00 sec)

27.QUARTER()

返回年份中的季度 取值1-4
语法:QUARTER(date)

mysql> select QUARTER('2020-05-22');
+-----------------------+
| QUARTER('2020-05-22') |
+-----------------------+
|                     2 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select QUARTER('2020-01-22');
+-----------------------+
| QUARTER('2020-01-22') |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select QUARTER('2020-08-22');
+-----------------------+
| QUARTER('2020-08-22') |
+-----------------------+
|                     3 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select QUARTER('2020-12-22');
+-----------------------+
| QUARTER('2020-12-22') |
+-----------------------+
|                     4 |
+-----------------------+
1 row in set (0.00 sec)

28.SEC_TO_TIME()

将数值类型的秒转换为时分秒

mysql> select SEC_TO_TIME(61);
+-----------------+
| SEC_TO_TIME(61) |
+-----------------+
| 00:01:01        |
+-----------------+
1 row in set (0.04 sec)

mysql> select SEC_TO_TIME(3661);
+-------------------+
| SEC_TO_TIME(3661) |
+-------------------+
| 01:01:01          |
+-------------------+
1 row in set (0.00 sec)

mysql> select SEC_TO_TIME(36610);
+--------------------+
| SEC_TO_TIME(36610) |
+--------------------+
| 10:10:10           |
+--------------------+
1 row in set (0.00 sec)

29.SECOND()

返回时间中的秒

mysql> select SECOND('2020-05-22 23:50:59');
+-------------------------------+
| SECOND('2020-05-22 23:50:59') |
+-------------------------------+
|                            59 |
+-------------------------------+
1 row in set (0.00 sec)

30.STR_TO_DATE()

语法:STR_TO_DATE(str,format)
将字符串转为日期时间格式

-- 这样随意的格式就是字符串,可以转为日期时间类型
mysql> select STR_TO_DATE('20200522 23:50:59','%Y%m%d %H:%i:%s');
+----------------------------------------------------+
| STR_TO_DATE('20200522 23:50:59','%Y%m%d %H:%i:%s') |
+----------------------------------------------------+
| 2020-05-22 23:50:59                                |
+----------------------------------------------------+
1 row in set (0.00 sec)

-- 这样标准的格式被mysql默认为时间类型了,不能再转了
mysql> select STR_TO_DATE('2020-05-22 23:50:59','%Y%m%d %H:%i:%s');
+------------------------------------------------------+
| STR_TO_DATE('2020-05-22 23:50:59','%Y%m%d %H:%i:%s') |
+------------------------------------------------------+
| NULL                                                 |
+------------------------------------------------------+
1 row in set, 2 warnings (0.00 sec)

31.SUBTIME()

语法:SUBTIME(expr1,expr2)
返回expr1和expr2的差,返回依旧是日期时间类型

-- expr2只能是时间类型 不能是日期类型
mysql> select SUBTIME('2020-01-01 00:00:00','2020-05-22 23:50:59');
+------------------------------------------------------+
| SUBTIME('2020-01-01 00:00:00','2020-05-22 23:50:59') |
+------------------------------------------------------+
| NULL                                                 |
+------------------------------------------------------+
1 row in set (0.00 sec)

-- 日期时间减去时间,得到日期时间
mysql>
mysql> select SUBTIME('2020-01-01 00:00:00','23:50:59');
+-------------------------------------------+
| SUBTIME('2020-01-01 00:00:00','23:50:59') |
+-------------------------------------------+
| 2019-12-31 00:09:01                       |
+-------------------------------------------+
1 row in set (0.00 sec)

--时间减去时间,得到的依旧是时间
mysql>
mysql> select SUBTIME('23:50:59','01:01:01');
+--------------------------------+
| SUBTIME('23:50:59','01:01:01') |
+--------------------------------+
| 22:49:58                       |
+--------------------------------+
1 row in set (0.00 sec)

32.SYSDATE()

返回当前时间,参考前面的NOW()

33.TIME()

返回日期时间格式中的时间

mysql> select TIME('2020-05-22 23:50:59');
+-----------------------------+
| TIME('2020-05-22 23:50:59') |
+-----------------------------+
| 23:50:59                    |
+-----------------------------+
1 row in set (0.02 sec)

mysql> select TIME('2020-05-22 23:50:59.000123');
+------------------------------------+
| TIME('2020-05-22 23:50:59.000123') |
+------------------------------------+
| 23:50:59.000123                    |
+------------------------------------+
1 row in set (0.00 sec)

34.TIME_FORMAT()

语法:TIME_FORMAT(time,format)
指定时间格式

mysql> select TIME_FORMAT('23:50:59','%H-%i-%s');
+------------------------------------+
| TIME_FORMAT('23:50:59','%H-%i-%s') |
+------------------------------------+
| 23-50-59                           |
+------------------------------------+
1 row in set (0.00 sec)

35.TIME_TO_SEC()

将时间类型转换为秒,与SEC_TO_TIME相反

mysql> select TIME_TO_SEC('23:50:59');
+-------------------------+
| TIME_TO_SEC('23:50:59') |
+-------------------------+
|                   85859 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select SEC_TO_TIME(85859);
+--------------------+
| SEC_TO_TIME(85859) |
+--------------------+
| 23:50:59           |
+--------------------+
1 row in set (0.00 sec)

36.TIMEDIFF()

语法:TIMEDIFF(expr1,expr2)
返回expr1和expr2的差,返回值认为时间类型

mysql> select timediff('2020-05-22 23:50:59.000001','2020-05-22 23:50:59.000003');
+---------------------------------------------------------------------+
| timediff('2020-05-22 23:50:59.000001','2020-05-22 23:50:59.000003') |
+---------------------------------------------------------------------+
| -00:00:00.000002                                                    |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

37.TIMESTAMP()

语法:TIMESTAMP(expr), TIMESTAMP(expr1,expr2)
如果有只1个参数,返回日期时间类型
如果有2个参数,expr1+expr2 然后返回日期时间类型

mysql> select timestamp('2020-05-22 23:50:59');
+----------------------------------+
| timestamp('2020-05-22 23:50:59') |
+----------------------------------+
| 2020-05-22 23:50:59              |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select timestamp('2020-05-22');
+-------------------------+
| timestamp('2020-05-22') |
+-------------------------+
| 2020-05-22 00:00:00     |
+-------------------------+
1 row in set (0.00 sec)

mysql> select timestamp('2020-05-22 23:50:59','00:10:01');
+---------------------------------------------+
| timestamp('2020-05-22 23:50:59','00:10:01') |
+---------------------------------------------+
| 2020-05-23 00:01:00                         |
+---------------------------------------------+
1 row in set (0.00 sec)

38.TIMESTAMPADD()

语法:TIMESTAMPADD(unit,interval,datetime_expr)
日期时间类型增加间隔
MICROSECOND (microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.

select TIMESTAMPADD(MICROSECOND,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(SECOND,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(MINUTE,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(HOUR,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(DAY,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(WEEK,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(MONTH,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(QUARTER,1,'2020-05-22 23:50:59');
select TIMESTAMPADD(YEAR,1,'2020-05-22 23:50:59');
mysql> select TIMESTAMPADD(MICROSECOND,1,'2020-05-22 23:50:59');
+---------------------------------------------------+
| TIMESTAMPADD(MICROSECOND,1,'2020-05-22 23:50:59') |
+---------------------------------------------------+
| 2020-05-22 23:50:59.000001                        |
+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(SECOND,1,'2020-05-22 23:50:59');
+----------------------------------------------+
| TIMESTAMPADD(SECOND,1,'2020-05-22 23:50:59') |
+----------------------------------------------+
| 2020-05-22 23:51:00                          |
+----------------------------------------------+
1 row in set (0.02 sec)

mysql> select TIMESTAMPADD(MINUTE,1,'2020-05-22 23:50:59');
+----------------------------------------------+
| TIMESTAMPADD(MINUTE,1,'2020-05-22 23:50:59') |
+----------------------------------------------+
| 2020-05-22 23:51:59                          |
+----------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(HOUR,1,'2020-05-22 23:50:59');
+--------------------------------------------+
| TIMESTAMPADD(HOUR,1,'2020-05-22 23:50:59') |
+--------------------------------------------+
| 2020-05-23 00:50:59                        |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(DAY,1,'2020-05-22 23:50:59');
+-------------------------------------------+
| TIMESTAMPADD(DAY,1,'2020-05-22 23:50:59') |
+-------------------------------------------+
| 2020-05-23 23:50:59                       |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(WEEK,1,'2020-05-22 23:50:59');
+--------------------------------------------+
| TIMESTAMPADD(WEEK,1,'2020-05-22 23:50:59') |
+--------------------------------------------+
| 2020-05-29 23:50:59                        |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(MONTH,1,'2020-05-22 23:50:59');
+---------------------------------------------+
| TIMESTAMPADD(MONTH,1,'2020-05-22 23:50:59') |
+---------------------------------------------+
| 2020-06-22 23:50:59                         |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(QUARTER,1,'2020-05-22 23:50:59');
+-----------------------------------------------+
| TIMESTAMPADD(QUARTER,1,'2020-05-22 23:50:59') |
+-----------------------------------------------+
| 2020-08-22 23:50:59                           |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPADD(YEAR,1,'2020-05-22 23:50:59');
+--------------------------------------------+
| TIMESTAMPADD(YEAR,1,'2020-05-22 23:50:59') |
+--------------------------------------------+
| 2021-05-22 23:50:59                        |
+--------------------------------------------+

39.TIMESTAMPDIFF()

语法:TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
求两个日期时间的间隔
MICROSECOND (microseconds), SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.

-- 求2个时间间隔的月份
mysql> SELECT TIMESTAMPDIFF(MONTH,'2020-02-01','2020-05-01');
+------------------------------------------------+
| TIMESTAMPDIFF(MONTH,'2020-02-01','2020-05-01') |
+------------------------------------------------+
|                                              3 |
+------------------------------------------------+
1 row in set (0.00 sec)
-- 默认向下取整,没有带小数
mysql> SELECT TIMESTAMPDIFF(MONTH,'2020-02-01','2020-05-02');
+------------------------------------------------+
| TIMESTAMPDIFF(MONTH,'2020-02-01','2020-05-02') |
+------------------------------------------------+
|                                              3 |
+------------------------------------------------+
1 row in set (0.00 sec)

40.TO_DAYS()

返回日期对应的天数,0000-00-01为第一天

mysql> SELECT TO_DAYS('0000-01-01');
+-----------------------+
| TO_DAYS('0000-01-01') |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT TO_DAYS('0001-01-01');
+-----------------------+
| TO_DAYS('0001-01-01') |
+-----------------------+
|                   366 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT TO_DAYS('2020-01-01');
+-----------------------+
| TO_DAYS('2020-01-01') |
+-----------------------+
|                737790 |
+-----------------------+
1 row in set (0.00 sec)

mysql>
mysql> SELECT TO_DAYS('20-01-01');
+---------------------+
| TO_DAYS('20-01-01') |
+---------------------+
|              737790 |
+---------------------+
1 row in set (0.00 sec)

41.TO_SECONDS()

返回日期对应的秒,0000-00-00 00:00:01为第一秒

mysql> SELECT TO_SECONDS('0000-01-01 00:00:01');
+-----------------------------------+
| TO_SECONDS('0000-01-01 00:00:01') |
+-----------------------------------+
|                             86401 |
+-----------------------------------+
1 row in set (0.00 sec)

42.UNIX_TIMESTAMP()

将时间转成数字,与FROM_UNIXTIME相互对应

mysql> select UNIX_TIMESTAMP('2020-05-22 23:50:59');
+---------------------------------------+
| UNIX_TIMESTAMP('2020-05-22 23:50:59') |
+---------------------------------------+
|                            1590162659 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select FROM_UNIXTIME(1590162659);
+---------------------------+
| FROM_UNIXTIME(1590162659) |
+---------------------------+
| 2020-05-22 23:50:59       |
+---------------------------+
1 row in set (0.02 sec)

43.WEEK()

返回本年的星期数
[图片上传中…(image.png-3aa5e3-1590162278137-0)]

-- 今天是本年的第20周,返回20
mysql> select week('2020-05-22');
+--------------------+
| week('2020-05-22') |
+--------------------+
|                 20 |
+--------------------+
1 row in set (0.02 sec)
-- 0代表星期天为一周的开始
mysql> select week('2020-05-22',0);
+----------------------+
| week('2020-05-22',0) |
+----------------------+
|                   20 |
+----------------------+
1 row in set (0.00 sec)
-- 1代表星期1位一周的开始
mysql> select week('2020-05-22',1);
+----------------------+
| week('2020-05-22',1) |
+----------------------+
|                   21 |
+----------------------+
1 row in set (0.00 sec)

44.WEEKDAY()

返回数值的星期数
0 = Monday, 1 = Tuesday, … 6 = Sunday

-- 今天是周五,返回了数值4
mysql> select weekday('2020-05-22');
+-----------------------+
| weekday('2020-05-22') |
+-----------------------+
|                     4 |
+-----------------------+
1 row in set (0.00 sec)

45.WEEKOFYEAR()

等价于:WEEK(date,3)

46.YEAR()

返回年份

mysql> select YEAR('2020-05-22');
+--------------------+
| YEAR('2020-05-22') |
+--------------------+
|               2020 |
+--------------------+
1 row in set (0.01 sec)

47.YEARWEEK()

语法:YEARWEEK(date), YEARWEEK(date,mode)
返回周,'0000:01:01’为第一周
mode同week,代表是周一还是昨天为本周的第一周

mysql> select YEARWEEK('0000:01:01');
+------------------------+
| YEARWEEK('0000:01:01') |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.02 sec)

mysql> select YEARWEEK('2020-05-22');
+------------------------+
| YEARWEEK('2020-05-22') |
+------------------------+
|                 202020 |
+------------------------+
1 row in set (0.00 sec)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值