在本教程中,我们将向您介绍MySQL TIME数据类型,并显示有用的时间函数来有效地处理时间数据。
MySQL TIME数据类型简介
MySQL使用HH:MM:SS格式来查询和显示代表一天中的时间值(在24小时内)。要表示两个事件之间的时间间隔,MySQL使用大于24小时的HHH:MM:SS格式。
要定义TIME数据类型的列,请使用以下语法:
column_name TIME;
例如,以下代码片段定义了一个名为start_at的列,其中包含TIME数据类型。
start_at TIME;
TIME值范围为-838:59:59至838:59:59。 此外,TIME值可以具有高达微秒精度(6位数)的小数秒部分。 要使用小数秒精度部分定义数据类型为TIME的列,请使用以下语法:
column_name TIME(N);
N是表示小数部分的整数值,最多6位数。
以下代码片段定义了TIME数据类型的列,其中包含3位数的小数秒。
begin_at TIME(3);
TIME值需要3个字节进行存储。如果TIME值包括分数秒精度,则会根据小数秒精度的位数获取额外的字节。下表说明了小数秒精度所需的存储空间。
分数秒精度
存储(字节)
0
0
1,2
1
3,4
2
5,6
3
例如,TIME和TIME(0)需要3个字节。 TIME(1)和TIME(2)需要4个字节(3 + 1); TIME(3)和TIME(6)分别需要5和6个字节。
MySQL TIME数据类型示例
让我们来看一下在表中对列使用TIME数据类型的例子。
首先,创建一个名为tests的新表,其中包含四个列:id,name,start_at和end_at。 start_at和end_at列的数据类型为TIME。
USE testdb;
CREATE TABLE tests (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
start_at TIME,
end_at TIME
);
第二步,在tests表中插入一行。
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 1', '08:00:00','10:00:00');
第三步,从tests表查询数据,如下语句:
SELECT
name, start_at, end_at
FROM
tests;
执行上面查询语句,得到以下结果 -
请注意,我们使用“HH:MM:SS”作为INSERT语句中的文字时间值。下面来看看MySQL可以识别的所有有效的时间文字。
MySQL TIME文字
除了我们之前提到的“HH:MM:SS”格式之外,MySQL还可以识别各种时间格式。
MySQL允许使用“HHMMSS”格式,而不使用分隔符(:)表示时间值。 例如’08:30:00‘和’10:15:00‘可以重写为’083000‘和’101500‘。
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 2','083000','101500');
但是,108000不是有效的时间值,因为80不代表正确的分钟。 在这种情况下,如果您尝试在表中插入无效的时间值,MySQL会引发错误。
INSERT INTO tests(name,start_at,end_at)
VALUES('Test invalid','083000','108000');
执行上述语句后,MySQL发出以下错误消息。
Error Code: 1292. Incorrect time value: '108000' for column 'end_at' at row 1
除了字符串格式之外,MySQL接受HHMMSS作为代表时间值的数字。也可以使用SS,MMSS。 例如,可以使用082000,而不是使用'082000',如下所示:
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 3',082000,102000);
对于时间间隔,您可以使用'D HH:MM:SS'格式,其中D代表天数从0到34的范围。更灵活的语法是'HH:MM','D HH:MM','D HH'或'SS'。
如果使用分隔符:,可以使用1位数字表示小时,分钟或秒。 例如,可以使用9:5:0而不是'09:05:00'。
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 4','9:5:0',100500);
MySQL TIME函数
MySQL提供了几个有用的时间函数来处理TIME数据。
获取当前时间
要获取数据库服务器的当前时间,请使用CURRENT_TIME函数。根据使用该函数的上下文,CURRENT_TIME函数以字符串('HH:MM:SS')或数值(HHMMSS)返回当前时间值。
以下语句说明了字符串和数字上下文中的CURRENT_TIME函数:
SELECT
CURRENT_TIME() AS string_now,
CURRENT_TIME() + 0 AS numeric_now;
执行上面查询语句,得到以下结果 -
+------------+-------------+
| string_now | numeric_now |
+------------+-------------+
| 23:04:53 | 230453 |
+------------+-------------+
1 row in set
从TIME值添加和减去时间
要将TIME值添加到另一个TIME值,请使用ADDTIME函数。要从另一个TIME值中减去TIME值,可以使用SUBTIME函数。
以下语句从当前时间起减去2小时30分钟。
SELECT
CURRENT_TIME(),
ADDTIME(CURRENT_TIME(), 023000),
SUBTIME(CURRENT_TIME(), 023000);
执行上面查询语句,得到以下结果 -
+----------------+---------------------------------+---------------------------------+
| CURRENT_TIME() | ADDTIME(CURRENT_TIME(), 023000) | SUBTIME(CURRENT_TIME(), 023000) |
+----------------+---------------------------------+---------------------------------+
| 23:05:03 | 25:35:03 | 20:35:03 |
+----------------+---------------------------------+---------------------------------+
1 row in set
此外,可以使用TIMEDIFF()函数来获取两个TIME值之间的差异。
SELECT
TIMEDIFF(end_at, start_at)
FROM
tests;
执行上面查询语句,得到以下结果 -
mysql> SELECT
TIMEDIFF(end_at, start_at)
FROM
tests;
+----------------------------+
| TIMEDIFF(end_at, start_at) |
+----------------------------+
| 02:00:00 |
| 01:45:00 |
| 02:00:00 |
| 01:00:00 |
+----------------------------+
4 rows in set
格式化MySQL TIME值
虽然MySQL在检索和显示TIME值时使用“HH:MM:SS”,但可以使用TIME_FORMAT函数以推荐的方式显示TIME值。
TIME_FORMAT函数类似于DATE_FORMAT函数,除了TIME_FORMAT函数仅用于格式化TIME值其它均差不多。
请参见以下一个示例 -
SELECT
name,
TIME_FORMAT(start_at, '%h:%i %p') start_at,
TIME_FORMAT(end_at, '%h:%i %p') end_at
FROM
tests;
执行上面查询语句,得到以下结果 -
+--------+----------+----------+
| name | start_at | end_at |
+--------+----------+----------+
| Test 1 | 08:00 AM | 10:00 AM |
| Test 2 | 08:30 AM | 10:15 AM |
| Test 3 | 08:20 AM | 10:20 AM |
| Test 4 | 09:05 AM | 10:05 AM |
+--------+----------+----------+
4 rows in set
在上面的时间格式字符串中:
%h表示从0到12的两位数小时数值。
%i表示从0到60的两位数分钟数值。
%p表示AM或PM,也就是表示上午或下午。
从TIME值提取小时,分钟和秒
要从TIME值中提取小时,分和秒,可以使用HOUR,MINUTE和SECOND函数,如下所示:
获取UTC时间值
要获取UTC时间,请使用UTC_TIME函数,如下所示:
SELECT
CURRENT_TIME(),
UTC_TIME();
执行上面查询语句,得到以下结果 -
+----------------+------------+
| CURRENT_TIME() | UTC_TIME() |
+----------------+------------+
| 23:05:41 | 15:05:41 |
+----------------+------------+
1 row in set
在本教程中,我们已经介绍了有关MySQL TIME数据类型和一些常用的时间函数来处理TIME值。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。