1.介绍

  • 时间的间隔
  • 时间格式的转换

2.时间间隔

计算两日期时间之间相差的天数秒数分钟数周数小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() 实现。函数 TimeStampDiff() 是MySQL本身提供的可以计算两个时间间隔的函数,语法为:

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
  • 返回日期或日期时间表达式 datetime_expr1 和datetime_expr2the 之间的整数差
  • datetime_expr1:起始日期
  • datetime_expr2:结束日期
  • unit:间隔单位

unit单位有以下几种

  • microseconds:表示间隔是毫秒
  • SECOND:间隔是秒
  • MINUTE:分钟
  • HOUR:小时
  • DAY:天
  • WEEK:周
  • MONTH:月
  • QUARTER:季度
  • YEAR :年

3.示例

-- 秒
select TIMESTAMPDIFF(second,'2022-11-10 12:30:30','2022-11-10 12:40:36') as '耗时(秒)';
-- 分钟
select TIMESTAMPDIFF(minute,'2022-11-10 12:30:30','2022-11-10 12:50:36') as '耗时(分钟)';
-- 小时
select TIMESTAMPDIFF(hour,'2022-11-10 12:30:30','2022-11-10 15:50:36') as '耗时(小时)';
-- 天
select TIMESTAMPDIFF(day,'2022-11-10 12:30:30','2022-11-13 15:50:36') as '耗时(天)';
-- 周
select TIMESTAMPDIFF(week,'2022-11-10 12:30:30','2022-12-13 15:50:36') as '耗时(周)';
-- 月
select TIMESTAMPDIFF(month,'2022-11-10 12:30:30','2022-12-13 15:50:36') as '耗时(月)';
-- 季度
select TIMESTAMPDIFF(month,'2022-11-10 12:30:30','2023-12-13 15:50:36') as '耗时(季度)';
-- 年
select TIMESTAMPDIFF(year,'2022-11-10 12:30:30','2023-12-13 15:50:36') as '耗时(年)';

3.1 计算两个日期相差多少秒

-- 秒
select TIMESTAMPDIFF(second,'2022-11-10 12:30:30','2022-11-10 12:40:36') as '耗时(秒)';

mysql时间复杂度 mysql时间间隔_数据库

 

 

3.2 计算两个日期相差多少分钟

-- 分钟
select TIMESTAMPDIFF(minute,'2022-11-10 12:30:30','2022-11-10 12:50:36') as '耗时(分钟)';

mysql时间复杂度 mysql时间间隔_字段_02

 

3.3 计算两个日期相差多少小时

-- 小时
select TIMESTAMPDIFF(hour,'2022-11-10 12:30:30','2022-11-10 15:50:36') as '耗时(小时)';

mysql时间复杂度 mysql时间间隔_java_03

3.4 计算两个日期相差多少天

-- 天
select TIMESTAMPDIFF(day,'2022-11-10 12:30:30','2022-11-13 15:50:36') as '耗时(天)';

mysql时间复杂度 mysql时间间隔_mysql_04

 

3.5 计算两个日期相差多少周

-- 周
select TIMESTAMPDIFF(week,'2022-11-10 12:30:30','2022-12-13 15:50:36') as '耗时(周)';

mysql时间复杂度 mysql时间间隔_mysql_05

3.6 计算两个日期相差多少月

-- 月
select TIMESTAMPDIFF(month,'2022-11-10 12:30:30','2022-12-13 15:50:36') as '耗时(月)';

mysql时间复杂度 mysql时间间隔_mysql_06

 

3.7 计算两个日期相差多少季度

-- 季度
select TIMESTAMPDIFF(month,'2022-11-10 12:30:30','2023-12-13 15:50:36') as '耗时(季度)';

mysql时间复杂度 mysql时间间隔_字段_07

3.8 计算两个日期相差多少年

-- 年
select TIMESTAMPDIFF(year,'2022-11-10 12:30:30','2023-12-13 15:50:36') as '耗时(年)';

 

mysql时间复杂度 mysql时间间隔_mysql_08

3.9 补充

另外计算两日期或时间之间相差多少天还可以使用 to_days 函数,但是该函数不用于阳历出现(1582)前的值,原因是当日历改变时,遗失的日期不会被考虑在内。因此对于1582 年之前的日期(或许在其它地区为下一年 ), 该函数的结果实不可靠的。具体用法如:

计算天的另一种函数TO_DAYS(TIME)

-- 天
select to_days('2022-11-13 15:50:36') - to_days('2022-11-10 12:30:30') as '耗时(天)';

 

mysql时间复杂度 mysql时间间隔_mysql_09

计算秒的另一种函数UNIX_TIMESTAMP(TIME)

-- 秒
select unix_timestamp('2022-11-10 12:40:36') - unix_timestamp('2022-11-10 12:30:30')  as '耗时(秒)';

mysql时间复杂度 mysql时间间隔_java_10

计算分钟的另一个函数SEC_TO_TIME(TIME)

-- 分钟
select sec_to_time(unix_timestamp('2022-11-10 12:50:36') - unix_timestamp('2022-11-10 12:30:30'))  as '耗时(分钟)';

mysql时间复杂度 mysql时间间隔_mysql时间复杂度_11

4.时间函数

4.1 NOW():用于获取当前日期和时间函数

-- 当前日期
select now() as '当前日期和时间' from dual;

mysql时间复杂度 mysql时间间隔_mysql时间复杂度_12

 

4.2 CURDATE():用于获取当前日期,同CURRENT_DATE()

-- 用于获取当前日期
select curdate() as '当前日期' from dual;

mysql时间复杂度 mysql时间间隔_java_13

 

4.3 CURTIME():用于获取当前时间,同CURRENT_TIME()

-- 用于获取当前时间,同CURRENT_TIME()
select curtime() as '当前时间' from dual;

mysql时间复杂度 mysql时间间隔_数据库_14

  

4.4 CURRENT_TIMESTAMP():用于获取当前日期和时间函数

-- 用于获取当前日期和时间函数
select CURRENT_TIMESTAMP() from dual;

mysql时间复杂度 mysql时间间隔_字段_15

 

4.5 DATE()函数,用于提取时间字段的日期,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"YYYY-mm-dd"

-- 用于提取时间字段的日期,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"YYYY-mm-dd"
select date('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_java_16

4.6 YEAR()函数,用于提取时间字段的年,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"YYYY"

-- 用于提取时间字段的年,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"YYYY"
select year('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_数据库_17

 

4.7 MONTH()函数,用于提取时间字段的月,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"mm",若月份前有0会忽略

-- 用于提取时间字段的月,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"mm",若月份前有0会忽略
select month('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_mysql时间复杂度_18

 

 

4.8 DAY()函数,用于提取时间字段的日期,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"dd",若日期前有0会忽略

-- 用于提取时间字段的日期,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"dd",若日期前有0会忽略
select day('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_java_19

 

4.9 TIME()函数,用于提取时间字段的时间,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"HH:ii:ss"

-- 用于提取时间字段的时间,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"HH:ii:ss"
select time('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_数据库_20

 

4.10 HOUR()函数,用于提取时间字段的小时,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"HH",若小时前有0会忽略,如08则返回8

-- 用于提取时间字段的小时,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"HH",若小时前有0会忽略,如08则返回8
select hour('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_数据库_21

 

 

4.11 MINUTE()函数,用于提取时间字段的分钟,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"ii",若分钟前有0会忽略,如08则返回8

-- 用于提取时间字段的分钟,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"ii",若分钟前有0会忽略,如08则返回8
select minute('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_字段_22

4.12 SECOND()函数,用于提取时间字段的秒,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"ss",若秒前有0会忽略,如08则返回8

-- 用于提取时间字段的秒,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"ss",若秒前有0会忽略,如08则返回8
select second('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_java_23

 

4.13 UNIX_TIMESTAMP()函数,获取当前时间戳,还可以将时间字段转换成时间戳

-- 获取当前时间戳,还可以将时间字段转换成时间戳
select unix_timestamp();
select unix_timestamp('2022-11-11 15:22:10');

mysql时间复杂度 mysql时间间隔_数据库_24

5 时间格式化函数

5.1 DATE_FORMAT()和TIME_FORMAT()功能相同

-- DATE_FORMAT()和TIME_FORMAT()功能相同
select date_format(now(),'%Y-%m-%d %H:%i:%s'); 
select time_format(now(),'%Y-%m-%d %H:%i:%s');
select date_format(now(),'%Y-%m-%d'); 
select time_format(now(),'%Y-%m-%d');

mysql时间复杂度 mysql时间间隔_java_25

 

 

6.本次测试所用所有sql

-- 秒
select TIMESTAMPDIFF(second,'2022-11-10 12:30:30','2022-11-10 12:40:36') as '耗时(秒)';
-- 分钟
select TIMESTAMPDIFF(minute,'2022-11-10 12:30:30','2022-11-10 12:50:36') as '耗时(分钟)';
-- 小时
select TIMESTAMPDIFF(hour,'2022-11-10 12:30:30','2022-11-10 15:50:36') as '耗时(小时)';
-- 天
select TIMESTAMPDIFF(day,'2022-11-10 12:30:30','2022-11-13 15:50:36') as '耗时(天)';
-- 周
select TIMESTAMPDIFF(week,'2022-11-10 12:30:30','2022-12-13 15:50:36') as '耗时(周)';
-- 月
select TIMESTAMPDIFF(month,'2022-11-10 12:30:30','2022-12-13 15:50:36') as '耗时(月)';
-- 季度
select TIMESTAMPDIFF(month,'2022-11-10 12:30:30','2023-12-13 15:50:36') as '耗时(季度)';
-- 年
select TIMESTAMPDIFF(year,'2022-11-10 12:30:30','2023-12-13 15:50:36') as '耗时(年)';


-- 天
select to_days('2022-11-13 15:50:36') - to_days('2022-11-10 12:30:30') as '耗时(天)';
-- 秒
select unix_timestamp('2022-11-10 12:40:36') - unix_timestamp('2022-11-10 12:30:30')  as '耗时(秒)';
-- 分钟
select sec_to_time(unix_timestamp('2022-11-10 12:50:36') - unix_timestamp('2022-11-10 12:30:30'))  as '耗时(分钟)';


-- 当前日期
select now() as '当前日期和时间' from dual;
-- 用于获取当前日期
select curdate() as '当前日期' from dual;
-- 用于获取当前时间,同CURRENT_TIME()
select curtime() as '当前时间' from dual;
-- 用于获取当前日期和时间函数
select CURRENT_TIMESTAMP() from dual;
-- 用于提取时间字段的日期,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"YYYY-mm-dd"
select date('2022-11-11 15:22:10');
-- 用于提取时间字段的年,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"YYYY"
select year('2022-11-11 15:22:10');
-- 用于提取时间字段的月,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"mm",若月份前有0会忽略
select month('2022-11-11 15:22:10');
-- 用于提取时间字段的日期,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"dd",若日期前有0会忽略
select day('2022-11-11 15:22:10');
-- 用于提取时间字段的时间,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"HH:ii:ss"
select time('2022-11-11 15:22:10');
-- 用于提取时间字段的小时,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"HH",若小时前有0会忽略,如08则返回8
select hour('2022-11-11 15:22:10');
-- 用于提取时间字段的分钟,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"ii",若分钟前有0会忽略,如08则返回8
select minute('2022-11-11 15:22:10');
-- 用于提取时间字段的秒,例如t01的tdate为'2020-05-26 11:11:11',返回的格式为"ss",若秒前有0会忽略,如08则返回8
select second('2022-11-11 15:22:10');
-- 获取当前时间戳,还可以将时间字段转换成时间戳
select unix_timestamp();
select unix_timestamp('2022-11-11 15:22:10');
-- DATE_FORMAT()和TIME_FORMAT()功能相同
select date_format(now(),'%Y-%m-%d %H:%i:%s'); 
select time_format(now(),'%Y-%m-%d %H:%i:%s');
select date_format(now(),'%Y-%m-%d'); 
select time_format(now(),'%Y-%m-%d');