如何在数据表列中插入计算值:将ended_at - started_at存入duration_seconds列
操作方案
你需要根据使用的数据库类型选择对应的时间差计算函数,以下是不同场景的实现方式:
存量数据批量填充
如果是要给表中已经存在的、已录入started_at和ended_at的行补填duration_seconds的值,使用UPDATE语句:
- MySQL环境
UPDATE 你的表名 SET duration_seconds = TIMESTAMPDIFF(SECOND, started_at, ended_at);
- PostgreSQL环境
UPDATE 你的表名 SET duration_seconds = EXTRACT(EPOCH FROM (ended_at - started_at))::INTEGER;
- SQL Server环境
UPDATE 你的表名 SET duration_seconds = DATEDIFF(SECOND, started_at, ended_at);
新数据插入时同步计算
插入新行时可以直接在插入语句中嵌入计算逻辑,无需提前算出结果:
-- 示例为MySQL语法,其他数据库替换对应时间差函数即可 INSERT INTO 你的表名 (字段1, 字段2, started_at, ended_at, duration_seconds) VALUES ('xxx', 'xxx', '2024-01-01 10:00:00', '2024-01-01 10:05:30', TIMESTAMPDIFF(SECOND, started_at, ended_at));
可选:设置自动计算列
如果希望后续数据库自动维护duration_seconds的值,不需要每次手动写计算逻辑,可以将该字段设为生成列:
- MySQL示例
ALTER TABLE 你的表名 MODIFY COLUMN duration_seconds INT GENERATED ALWAYS AS (TIMESTAMPDIFF(SECOND, started_at, ended_at)) STORED;
- PostgreSQL示例
ALTER TABLE 你的表名 ADD COLUMN duration_seconds INT GENERATED ALWAYS AS (EXTRACT(EPOCH FROM (ended_at - started_at))::INTEGER) STORED;
内容的提问来源于stack exchange,提问作者Neville Jeffree
相关产品推荐
相关产品推荐

