Mastering MySQL TIME Data Type

摘要:在本教程中,我们将向您介绍 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:59838: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

例如, TIMETIME(0)占用3 个字节。 TIME(1)TIME(2)占用 4 个字节 (3 + 1); TIME(3)TIME(6)分别占用 5 和 6 个字节。

MySQL TIME 数据类型示例

让我们看一下对表中的列使用TIME数据类型的示例。

首先,创建一个名为tests新表,该表由四列组成: idnamestart_atend_atstart_atend_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)
MySQL TIME example

请注意,我们在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)
MySQL TIME HHMMSS literal

但是, 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 1Code language: SQL (Structured Query Language) (sql)

除了字符串格式之外,MySQL 还接受HHMMSS作为表示时间值的数字。您还可以使用SSMMSS 。例如,您可以使用'082000' 082000 ' ,如下所示:

INSERT INTO tests(name,start_at,end_at)
VALUES('Test 3',082000,102000);Code language: SQL (Structured Query Language) (sql)
MySQL TIME HHMMSS numeric

对于时间间隔,您可以使用'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 literals 1 digit

有用的 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)
MySQL CURRENT_TIME 函数

从 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)
MySQL ADDTIME SUBTIME example

此外,您可以使用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)
MySQL TIME_FORMAT function example

在上面的时间格式字符串中:

  • %h表示从 0 到 12 的两位数小时。
  • %i表示从 0 到 60 的两位数分钟。
  • %p表示上午或下午。

从 TIME 值中提取小时、分钟和秒

要从TIME值中提取小时、分钟和秒,请使用HOURMINUTESECOND函数,如下所示:

MySQL HOUR MINUTE SECOND functions

获取UTC时间值

要获取 UTC 时间,请使用UTC_TIME函数,如下所示:

SELECT 
   CURRENT_TIME(), 
   UTC_TIME();Code language: SQL (Structured Query Language) (sql)
MySQL UTC_TIME

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

本教程有帮助吗?