MySQL时间戳
简介:在本教程中,您将学习MySQL TIMESTAMP数据类型和TIMESTAMP列功能,例如自动初始化和更新。
MySQL TIMESTAMP数据类型简介
MySQL TIMESTAMP是保存日期和时间组合的时间数据类型。
TIMESTAMP的格式为YYYY-MM-DD HH:MM:SS,固定为19个字符。
TIMESTAMP值的范围是UTC的" 1970-01-01 00:00:01"到UTC的" 2038-01-19 03:14:07"。
当您在表格中插入TIMESTAMP值时,MySQL会将其从连接时区转换为UTC进行存储。
当您查询TIMESTAMP值时,MySQL会将UTC值转换回您连接的时区。
请注意,对于其他时间数据类型(例如DATETIME)不会发生此转换。
默认情况下,连接时区是MySQL服务器的时区。
连接到MySQL Server时,可以使用其他时区。
当您检索客户端在其他时区插入的TIMESTAMP值时,您将获得与数据库中存储的值不同的值。
只要您不更改时区,就可以获得与您存储的相同的TIMESTAMP值。
MySQL TIMESTAMP时区示例
让我们举个例子来看一下MySQL如何处理TIMESTAMP值。
首先,创建一个名为test_timestamp的新表,该表具有TIMESTAMP列:t1;
CREATE TABLE test_timestamp ( t1 TIMESTAMP );
其次,使用SET time_zone语句将会话的时区设置为" +00:00" UTC。
SET time_zone='+00:00';
第三,将TIMESTAMP值插入到test_timestamp表中。
INSERT INTO test_timestamp(t1) VALUES('2008-01-01 00:00:01');
第四,从test_timestamp表中选择TIMESTAMP值。
SELECT t1 FROM test_timestamp;
第五,将会话的时区设置为其他时区,以查看我们将从数据库服务器获得的价值:
SET time_zone ='+03:00';
最后,从表中查询数据:
SELECT t1 FROM test_timestamp;
如您所见,我们收到了根据新时区调整的其他时间值。
自动初始化和更新TIMESTAMP列
考虑以下示例。
首先,创建一个名为分类的表:
CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
在类别表中,created_at列是TIMESTAMP列,其默认值设置为CURRENT_TIMESTAMP。
其次,在类别表中插入新行,而无需指定created_at列的值:
INSERT INTO categories(name) VALUES ('A');
SELECT * FROM categories;
从输出中可以看到,MySQL在插入时使用了时间戳记作为created_at列的默认值。
因此,对于未为该列指定值的插入行,可以将TIMESTAMP列自动初始化为当前时间戳。
此功能称为自动初始化。
第三,在类别表中添加一个名为updated_at的新列。
ALTER TABLE categories ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Updated_at列的默认值为CURRENT_TIMESTAMP。
并且,我们在DEFAULT CURRENT_TIMESTAMP子句之后有一个新子句ON UPDATE CURRENT_TIMESTAMP。
让我们看看它的效果。
第四,在类别表中插入新行。
INSERT INTO categories(name) VALUES('B');
第五,从类别表中查询数据:
SELECT * FROM categories;
列created_at的默认值是插入行时的时间戳。
第六,更新行ID 2的列名中的值:
UPDATE categories SET name = 'B+' WHERE id = 2;
第七,从类别表中查询数据以检查更新:
SELECT * FROM categories WHERE id = 2;
请注意,updated_at列中的值已更改为更新行时的时间戳。
当行中其他任何列的值从当前值更改时,TIMESTAMP列自动更新为当前时间戳的功能称为自动更新。
列updated_at称为自动更新的列。
请注意,如果您执行UPDATE语句以更新name列的相同值,则updated_at列将不会更新。
UPDATE categories SET name = 'B+' WHERE id = 2;
update_at中的值保持不变。
有关自动初始化和更新的更多信息,请在MySQL网站上查看时间初始化。
从MySQL 5.6.5开始,DATETIME列还具有自动初始化和更新功能。
此外,DEFAULT_CURRENT_TIMESTAMP和ON UPDATE CURRENT TIMESTAMP可以应用于多个列。
在本教程中,您了解了MySQL TIMESTAMP数据类型以及如何使用TIMESTAMP列的自动初始化和更新功能。