备注:测试数据库版本为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() | 返回星期数 |
语法: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)
语法: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)
返回一个’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)
返回’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)
返回当前日期和时间,返回格式 ‘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)
从日期时间类型中截取日期类型
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)
格式日期指定,真的很丰富
格式 | 描述 |
---|---|
%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) |
%p | AM 或 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)
返回两个时间间隔的天数
语法: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)
返回指定日期的星期英文
mysql> select dayname(now());
+----------------+
| dayname(now()) |
+----------------+
| Friday |
+----------------+
1 row in set (0.00 sec)
返回指定日期当月的天数,数字类型,返回值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)
返回星期几,数值类型,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)
返回今天是当年的第几天 (1-366)
mysql> select DAYOFYEAR('2020-05-22');
+-------------------------+
| DAYOFYEAR('2020-05-22') |
+-------------------------+
| 143 |
+-------------------------+
1 row in set (0.00 sec)
提取日期的部分
语法: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)
与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)
与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)
返回日期格式的字符串
语句 | 格式 |
---|---|
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)
提取小时,可以超过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)
返回当月的最后一天,如果日期错误,返回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)
根据年份和当年的第几天,返回日期
语法: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)
根据时分秒构造时间
语法: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)
从表达式中返回微妙
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)
从时间类型中返回分
mysql> SELECT MINUTE('2020-05-22 20:05:03');
+-------------------------------+
| MINUTE('2020-05-22 20:05:03') |
+-------------------------------+
| 5 |
+-------------------------------+
1 row in set (0.01 sec)
从时间类型中返回月份-数值类型
mysql> SELECT MONTH('2020-05-22 20:05:03');
+------------------------------+
| MONTH('2020-05-22 20:05:03') |
+------------------------------+
| 5 |
+------------------------------+
1 row in set (0.00 sec)
从时间类型中返回月份-英文
mysql> SELECT MONTHNAME('2020-05-22 20:05:03');
+----------------------------------+
| MONTHNAME('2020-05-22 20:05:03') |
+----------------------------------+
| May |
+----------------------------------+
1 row in set (0.05 sec)
语法: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)
返回两个年月间隔的月份
语法: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)
返回年份中的季度 取值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)
将数值类型的秒转换为时分秒
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)
返回时间中的秒
mysql> select SECOND('2020-05-22 23:50:59');
+-------------------------------+
| SECOND('2020-05-22 23:50:59') |
+-------------------------------+
| 59 |
+-------------------------------+
1 row in set (0.00 sec)
语法: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)
语法: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)
返回当前时间,参考前面的NOW()
返回日期时间格式中的时间
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)
语法: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)
将时间类型转换为秒,与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)
语法: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)
语法: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)
语法: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 |
+--------------------------------------------+
语法: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)
返回日期对应的天数,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)
返回日期对应的秒,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)
将时间转成数字,与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)
返回本年的星期数
[图片上传中…(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)
返回数值的星期数
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)
等价于:WEEK(date,3)
返回年份
mysql> select YEAR('2020-05-22');
+--------------------+
| YEAR('2020-05-22') |
+--------------------+
| 2020 |
+--------------------+
1 row in set (0.01 sec)
语法: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)