我在 MariaDB 中运行以下查询(10.5.18-MariaDB - MariaDB 服务器)
CREATE TABLE `test_table` (
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB;
INSERT INTO `test_table` (`updated_at`) VALUES ('2021-03-27 1:30:00');
UPDATE test_table
SET updated_at = updated_at + INTERVAL 1 YEAR
并收到以下错误
Incorrect datetime value: '2022-03-27 01:30:00' for column `test_table`.`updated_at` at row 1
我知道由于与 BST 相关的 DST 更改,返回的值不是我的数据库中的真实日期
我的印象是 TIMESTAMP 存储为 UTC 纪元的秒数,并且
updated_at + INTERVAL 1 YEAR
只会将一年中的秒数添加到该值,从而始终产生有效的结果(在范围内)
似乎发生了某种到 DATETIME 的转换,但是,这是正确的吗?
如果我想保留数据库时区和列数据类型,并且我一直更喜欢 INTERVAL 语法。有没有一种干净的方法来重写 UPDATE 查询以按我的预期工作?
解决方案:01
use limit statement
CREATE TABLE `test_table` (
`updated_at` timestamp NULL DEFAULT NULL
);
INSERT INTO `test_table` (`updated_at`) VALUES (cast('2021-03-27 1:30:00' as datetime));
INSERT INTO `test_table` (`updated_at`) VALUES (cast('2021-03-28 1:30:00' as datetime));
UPDATE `test_table`
SET `updated_at` = updated_at + INTERVAL 1 YEAR
limit 1;
select * from `test_table`;
解决方案:02 添加额外的列以及特定列的使用条件
创建表
test_table
(
id 整数不为空主键,
updated_at
时间戳 NULL DEFAULT NULL
);
INSERT INTO `test_table` (id, `updated_at`) VALUES (1, cast('2021-03-27 1:30:00' as datetime));
INSERT INTO `test_table` (id, `updated_at`) VALUES (2, cast('2021-03-28 1:30:00' as datetime));
UPDATE `test_table`
SET `updated_at` = updated_at + INTERVAL 11 YEAR
where id = 1;
select * from `test_table`;