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
相关产品推荐
相关产品推荐

