You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中使用TIMEDIFF创建计算列NBHEURES时报错求助

解决ALTER TABLE添加计算列的类型错误问题

嘿,我一眼就看出问题出在哪了——你想用TIMEDIFF(FINRES, DEBUTRES)直接生成一个integer类型的计算列,但TIMEDIFF()返回的是TIME格式的值(比如02:30:15这种时分秒结构),数据库没办法直接把这种格式转成整数,得先把时间差转换成具体的数值才行。

下面针对不同需求给你几个可行的解决方案,假设你用的是MySQL(因为TIMEDIFF是MySQL的函数):

1. 存储时间差的总秒数(最精准的整数方案)

如果需要完整保留时间差的精度,把时间差转成总秒数是最稳妥的,用TIME_TO_SEC()函数就能实现:

ALTER TABLE personne ADD NBHEURES integer AS (TIME_TO_SEC(TIMEDIFF(FINRES, DEBUTRES)));

举个例子:如果FINRES是10:15:00,DEBUTRES是08:00:00,这个计算列就会存8100(也就是2小时15分对应的秒数)。

2. 直接存储小时数(整数格式)

如果你的需求是得到小时数的整数结果,分两种情况:

  • 向下取整(比如2小时30分存成2):
ALTER TABLE personne ADD NBHEURES integer AS (FLOOR(TIME_TO_SEC(TIMEDIFF(FINRES, DEBUTRES))/3600));
  • 四舍五入到整数(比如2小时30分存成3):
ALTER TABLE personne ADD NBHEURES integer AS (ROUND(TIME_TO_SEC(TIMEDIFF(FINRES, DEBUTRES))/3600));

要是你需要保留小数(比如2.5小时),那别用integer,换成decimal类型更合适:

ALTER TABLE personne ADD NBHEURES decimal(5,2) AS (TIME_TO_SEC(TIMEDIFF(FINRES, DEBUTRES))/3600);

为啥原来的语句会报错?

TIMEDIFF()返回的是TIME类型,本质是带格式的时间字符串,数据库没有办法自动把这种格式转换成整数,必须通过TIME_TO_SEC()这类函数显式转成数值后,才能定义成integer类型的计算列。

如果你用的不是MySQL?

比如PostgreSQL里没有TIMEDIFF和TIME_TO_SEC,可以用EXTRACT函数来实现:

-- PostgreSQL:存储总秒数
ALTER TABLE personne ADD NBHEURES integer AS (EXTRACT(EPOCH FROM (FINRES - DEBUTRES)));
-- PostgreSQL:存储小时数
ALTER TABLE personne ADD NBHEURES integer AS (ROUND(EXTRACT(EPOCH FROM (FINRES - DEBUTRES))/3600));

内容的提问来源于stack exchange,提问作者zouhair zouita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:49