MySQL时间戳

时间:2019-11-20 08:52:11  来源:igfitidea点击:

简介:在本教程中,您将学习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列的自动初始化和更新功能。