按 INTERVAL 增加 TIMESTAMP 列会产生不正确的日期时间

问题描述 投票:0回答:1

我在 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 查询以按我的预期工作?

mysql mariadb timestamp
1个回答
0
投票

解决方案: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`;
© www.soinside.com 2019 - 2024. All rights reserved.