摘要:在本教程中,我们将向您介绍 MySQL TIME
数据类型,并向您展示有效操作时间数据的有用时态函数。
MySQL TIME 数据类型简介
MySQL 使用'HH:MM:SS'
格式来查询和显示代表一天中某个时间(24 小时内)的时间值。为了表示两个事件之间的时间间隔,MySQL 使用'HHH:MM:SS'
格式,该格式大于 24 小时。
要定义TIME
列,请使用以下语法:
column_name TIME;
Code language: SQL (Structured Query Language) (sql)
例如,以下代码片段定义了一个名为start_at
且具有TIME
数据类型的列。
start_at TIME;
Code language: SQL (Structured Query Language) (sql)
TIME
值的范围是-838:59:59
到838:59:59
。此外, TIME
值可以包含精度高达微秒(6 位)的小数秒部分。要定义数据类型为带有小数秒精度部分的TIME
的列,请使用以下语法:
column_name TIME(N);
Code language: SQL (Structured Query Language) (sql)
N是一个整数,代表小数部分,最多6位。
以下代码片段定义了一个TIME
数据类型的列,其中包括 3 位秒小数位。
begin_at TIME(3);
Code language: SQL (Structured Query Language) (sql)
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
。
CREATE TABLE tests (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
start_at TIME,
end_at TIME
);
Code language: SQL (Structured Query Language) (sql)
其次,在tests
表中插入一行。
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 1', '08:00:00','10:00:00');
Code language: SQL (Structured Query Language) (sql)
第三,从tests
表中查询数据。
SELECT
name, start_at, end_at
FROM
tests;
Code language: SQL (Structured Query Language) (sql)

请注意,我们在INSERT
语句中使用'HH:MM:SS'
作为文字时间值。让我们检查一下 MySQL 可以识别的所有有效时间文字。
MySQL 时间文字
除了我们之前提到的'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');
Code language: SQL (Structured Query Language) (sql)

但是, 108000
不是有效的时间值,因为80
不代表正确的分钟。在这种情况下,如果您尝试将无效的时间值插入表中,MySQL 将引发错误。
INSERT INTO tests(name,start_at,end_at)
VALUES('Test invalid','083000','108000');
Code language: SQL (Structured Query Language) (sql)
执行上述语句后,MySQL 发出以下错误消息。
Error Code: 1292. Incorrect time value: '108000' for column 'end_at' at row 1
Code language: SQL (Structured Query Language) (sql)
除了字符串格式之外,MySQL 还接受HHMMSS
作为表示时间值的数字。您还可以使用SS
、 MMSS
。例如,您可以使用'082000'
082000
' ,如下所示:
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 3',082000,102000);
Code language: SQL (Structured Query Language) (sql)

对于时间间隔,您可以使用'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);
Code language: SQL (Structured Query Language) (sql)

有用的 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;
Code language: SQL (Structured Query Language) (sql)

从 TIME 值中添加和减去时间
要将一个TIME
值添加到另一个TIME
值,可以使用ADDTIME
函数。要从另一个TIME
值中减去一个TIME
值,请使用SUBTIME
函数。
以下语句将当前时间加或减 2 小时 30 分钟。
SELECT
CURRENT_TIME(),
ADDTIME(CURRENT_TIME(), 023000),
SUBTIME(CURRENT_TIME(), 023000);
Code language: SQL (Structured Query Language) (sql)

此外,您可以使用TIMEDIFF()
函数来获取两个TIME
值之间的差异。
SELECT
TIMEDIFF(end_at, start_at)
FROM
tests;
Code language: SQL (Structured Query Language) (sql)
格式化 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;
Code language: SQL (Structured Query Language) (sql)

在上面的时间格式字符串中:
%h
表示从 0 到 12 的两位数小时。-
%i
表示从 0 到 60 的两位数分钟。 -
%p
表示上午或下午。
从 TIME 值中提取小时、分钟和秒
要从TIME
值中提取小时、分钟和秒,请使用HOUR
、 MINUTE
和SECOND
函数,如下所示:

获取UTC时间值
要获取 UTC 时间,请使用UTC_TIME
函数,如下所示:
SELECT
CURRENT_TIME(),
UTC_TIME();
Code language: SQL (Structured Query Language) (sql)

在本教程中,我们详细介绍了 MySQL TIME
数据类型以及一些用于操作TIME
值的常用时态函数。