MySQL 入门教程
  • 教程目录
  • 第一章 基础教程
    • 第一节 入门
      • 1.1 安装
      • 1.2 示例数据库
    • 第二节 查询数据
      • 2.1 SELECT 语句
      • 2.2 SELECT DISTINCT 语句
    • 第三节 过滤数据
      • 3.1 WHERE 子句
      • 3.2 AND 运算符
      • 3.3 OR 运算符
      • 3.4 IN 运算符
      • 3.5 BETWEEN 运算符
      • 3.6 LIKE 运算符
      • 3.7 LIMIT 子句
      • 3.8 IS NULL 运算符
    • 第四节 数据排序
      • 4.1 ORDER BY 子句
      • 4.1 自然排序
    • 第五节 连接表
      • 5.1 别名
      • 5.2 INNER JOIN
      • 5.3 LEFT JOIN
      • 5.4 自连接
      • 5.5 CROSS JOIN
    • 第六节 分组数据
      • 6.1 GROUP BY子句
      • 6.2 HAVING 子句
    • 第七节 子查询,派生表和通用表达式
      • 7.1 子查询
      • 7.2 派生表
      • 7.3 公共表表达式
      • 7.4 递归 CTE
    • 第八节 集合操作符
      • 8.1 UNION 和 UNION ALL
      • 8.2 INTERSECT 模拟
    • 第九节 修改数据
      • 9.1 INSERT 语句
      • 9.2 INSERT IGNORE
      • 9.3 UPDATE 语句
      • 9.4 UPDATE JOIN 语句
      • 9.5 DELETE
      • 9.6 ON DELETE CASCADE.
      • 9.7 DELETE JOIN
      • 9.8 REPLACE 语句
      • 9.9 PREPARE 语句
    • 第十节 事务
      • 10.1 事务介绍
      • 10.2 表锁定
    • 第十一节 管理数据库和表
      • 11.1 数据库管理
      • 11.2 MySQL 表类型
      • 11.3 CREATE TABLE
      • 11.4 序列
      • 11.5 ALTER TABLE
      • 11.6 重命名表
      • 11.7 从表中删除列
      • 11.8 向表中添加新列
      • 11.9 删除表
      • 11.10 临时表
      • 11.11 TRUNCATE TABLE
    • 第十二节 索引
      • 12.1 管理索引
      • 12.1 UNIQUE 索引
    • 第十三节 数据类型
      • 13.1 INT
      • 13.2 DECIMAL
      • 13.3 BIT
      • 13.4 BOOLEAN
      • 13.5 CHAR
      • 13.6 VARCHAR
      • 13.7 TEXT
      • 13.8 DATE
      • 13.9 TIME
      • 13.10 DATETIME
      • 13.11 TIMESTAMP
      • 13.12 JSON
      • 13.13 ENUM
    • 第十四节 约束
      • 14.1 NOT NULL 约束
      • 14.2 主键约束
      • 14.2 外键约束
      • 14.4 UNIQUE 约束
      • 14.5 CHECK 约束
    • 第十五节 全球化
      • 15.1 字符集
      • 15.2 校对规则
    • 第十六节 导入和导出
      • 16.1 导入 CSV 文件
      • 16.2 导出为 CSV
  • 第二章 技巧
    • CTE 简介
    • 递归 CTE
    • 邻接列表模型和层次结构
    • 获取行数
    • 比较表
    • 找重复值
    • 删除重复行
    • UUID 和主键
    • 复制表数据
    • 变量
    • 生成列
    • 连续行比较
    • 更改存储引擎
    • 基于正则表达式的搜索
    • row_number 模拟
    • 随机选择记录
    • 选择第 n 个最高纪录
    • 重置自动增量值
    • MariaDB 与 MySQL 比较
    • 间隔
    • NULL 详细和应用
    • 获取今天的日期
    • 将NULL值映射到有意义的值
    • 注释
  • 第三章 存储过程
    • 简介
    • 入门
    • 变量
    • 参数
    • 返回多个值
    • IF语句
    • CASE语句
    • IF和CASE语句的技巧
    • 循环
    • 游标
    • 列出存储过程
    • 错误处理
    • SIGNAL 和 ESIGNAL 语句
    • 存储函数
  • 第四章 触发器
    • 实现
    • 创建
    • 创建多个触发器
    • 管理
    • 计划事件
    • 修改事件
  • 第五章 视图
    • 简介
    • 实现和限制
    • 创建
    • 可更新视图
    • 确保视图一致性
    • 检查选项子句
    • 管理
  • 第六章 全文搜索
    • 简介
    • 定义索引
    • 自然语言全文搜索
    • 布尔全文搜索
    • 查询扩展
    • ngram全文解析器
  • 第七章 函数
  • 第八章 管理
    • 访问控制系统入门
    • 创建用户
    • 授予权限
    • 撤销权限
    • 角色管理
    • 删除用户
    • 维护数据库表
    • 备份数据库
    • 列出数据库
    • 列出表
    • 列出表的列
    • 列出用户
Powered by GitBook
On this page
  • MySQL TIME数据类型简介
  • MySQL TIME数据类型示例
  • MySQL TIME文字
  • MySQL TIME函数

Was this helpful?

  1. 第一章 基础教程
  2. 第十三节 数据类型

13.9 TIME

Previous13.8 DATENext13.10 DATETIME

Last updated 5 years ago

Was this helpful?

在本教程中,我们将向您介绍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
);
INSERT INTO tests(name,start_at,end_at)
VALUES('Test 1', '08:00:00','10:00:00');
SELECT 
    name, start_at, end_at
FROM
    tests;

执行上面查询语句,得到以下结果 -

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值。

请参见以下一个示例 -

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值。

第二步,在tests表中一行。

第三步,从tests表,如下语句:

请注意,我们使用“HH:MM:SS”作为语句中的文字时间值。下面来看看MySQL可以识别的所有有效的时间文字。

TIME_FORMAT函数类似于函数,除了TIME_FORMAT函数仅用于格式化TIME值其它均差不多。

间隔
整数值
插入
查询数据
INSERT
DATE_FORMAT
img