SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

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 位数字),而 MMDD 分别代表日期的月份和日期部分(前导零的 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());

但是,如果您不想手动插入当前日期和时间,您可以简单地使用 TIMESTAMPDATETIME 数据类型的自动初始化和自动更新属性。

要分配自动属性,请在列定义中指定 DEFAULT CURRENT_TIMESTAMPON 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。

mysql> SELECT name, YEAR(birth_date) FROM users;

同样,您可以使用函数 DAYOFMONTH() 来获取月份中的日期,例如 如果任何用户的 birth_date 是 1986-10-06,则 DAYOFMONTH(birth_date) 将返回 6。

mysql> SELECT name, DAYOFMONTH(birth_date) FROM users;

格式化日期或时间

如果您希望结果集中更具描述性和可读性的日期格式,可以使用 DATE_FORMAT()TIME_FORMAT() 函数重新格式化现有日期和时间值。

下面的 SQL 语句会将 users 表的 birth_date 列的值格式化为更易读的格式,例如值 1987-01-14 到 1987 年 1 月 14 日。

mysql> SELECT name, DATE_FORMAT(birth_date, '%M %e, %Y') FROM users;
Advertisements