SQL 日期和时间
在本教程中,您将学习如何在 SQL 中使用日期和时间。
日期和时间操作
除了字符串和数字,您通常还需要在数据库中存储日期和/或时间值,例如用户的出生日期、员工的招聘日期、未来事件的日期、特定行的创建或修改日期和时间 一张桌子,等等。
这种类型的数据被称为时间数据,每个数据库引擎都有一个默认的存储格式和数据类型来存储它们。 下表显示了 MySQL 数据库服务器支持的用于处理日期和时间的数据类型。
类型 | 默认格式 | 允许值 |
---|---|---|
DATE |
YYYY-MM-DD |
1000-01-01 to 9999-12-31 |
TIME |
HH:MM:SS or HHH:MM:SS |
-838:59:59 to 838:59:59 |
DATETIME |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 to 9999-12-31 23:59:59 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:00 to 2037-12-31 23:59:59 |
YEAR |
YYYY |
1901 to 2155 |
DATE
值具有 YYYY-MM-DD
格式,其中 YYYY
代表全年(4 位数字),而 MM
和 DD
分别代表日期的月份和日期部分(前导零的 2 位数字)。 同样,TIME
值通常具有 HH:MM:SS
格式,其中 HH
, MM
, 和 SS
分别代表时间的小时、分钟和秒部分。
以下语句演示了如何在数据库表中插入日期值:
INSERT INTO employees (emp_name, hire_date, salary)
VALUES ('Adam Smith', '2015-06-24', 4500);
注意: 在 MySQL 中,TIME
值的小时部分可能更大,因为 MySQL 将它们视为经过时间。 这意味着 TIME
数据类型不仅可以用来表示一天中的某个时间(必须小于 24 小时),还可以用来表示两个事件之间的时间间隔,它可能大于 24 小时,甚至是负数。
跟踪行创建或修改时间
在使用大型应用程序的数据库时,您经常需要在数据库中存储记录创建时间或上次修改时间,例如,存储用户注册的日期和时间,或者用户上次更新密码的时间等。
在 MySQL 中,您可以使用 NOW()
函数插入当前时间戳,如下所示:
-- MySQL 数据库的语法
INSERT INTO users (name, birth_date, created_at)
VALUES ('Bilbo Baggins', '1998-04-16', NOW());
但是,如果您不想手动插入当前日期和时间,您可以简单地使用 TIMESTAMP
和 DATETIME
数据类型的自动初始化和自动更新属性。
要分配自动属性,请在列定义中指定 DEFAULT CURRENT_TIMESTAMP
和 ON UPDATE CURRENT_TIMESTAMP
子句,如下所示:
-- MySQL 数据库的语法
CREATE TABLE users (
id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE,
birth_date DATE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
注意: DATETIME
数据类型的自动初始化和更新仅在 MySQL 5.6.5 或更高版本中可用。 如果您使用的是旧版本,请改用 TIMESTAMP
。
提取部分日期或时间
在某些情况下,您可能只想获取部分日期或时间。 在 MySQL 中,您可以使用专门为提取时间值的一部分而设计的函数,例如 YEAR()
, MONTH()
, DAYOFMONTH()
, MONTHNAME()
, DAYNAME()
, HOUR()
, MINUTE()
, SECOND()
等。
以下 SQL 语句将提取 birth_date 列值的年份部分,例如 如果任何用户的 birth_date 是 1987-01-14,则 YEAR(birth_date)
将返回 1987。
同样,您可以使用函数 DAYOFMONTH()
来获取月份中的日期,例如 如果任何用户的 birth_date 是 1986-10-06,则 DAYOFMONTH(birth_date)
将返回 6。
格式化日期或时间
如果您希望结果集中更具描述性和可读性的日期格式,可以使用 DATE_FORMAT()
和 TIME_FORMAT()
函数重新格式化现有日期和时间值。
下面的 SQL 语句会将 users 表的 birth_date 列的值格式化为更易读的格式,例如值 1987-01-14 到 1987 年 1 月 14 日。