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

使用Sequelize ORM对MySQL中时间列求和的实现咨询

解决Sequelize + MySQL 时间列求和问题

因为MySQL本身支持对时间类型的转换与聚合操作,Sequelize可以通过调用原生SQL函数来实现你的需求,核心思路是先将时间转成总秒数求和,再转回时分秒格式。

情况1:列类型为MySQL的TIME类型

直接使用TIME_TO_SEC()将时间转为秒数,求和后用SEC_TO_TIME()转回时分秒格式:

const totalTime = await YourModel.findOne({
  attributes: [
    [sequelize.fn('SEC_TO_TIME', sequelize.fn('SUM', sequelize.fn('TIME_TO_SEC', sequelize.col('your_time_column')))), 'total_duration']
  ]
});

// 结果会在totalTime.dataValues.total_duration中,格式如HH:MM:SS
console.log(totalTime.dataValues.total_duration);

情况2:列类型为字符串(存储为'HH:MM:SS'格式)

如果你的列是字符串类型,需要先将字符串转为TIME类型再处理:

const totalTime = await YourModel.findOne({
  attributes: [
    [
      sequelize.fn('SEC_TO_TIME', sequelize.fn('SUM', sequelize.fn('TIME_TO_SEC', sequelize.fn('STR_TO_DATE', sequelize.col('your_time_column'), '%H:%i:%s')))), 
      'total_duration'
    ]
  ]
});

注意事项

  • 确保替换代码中的YourModel为你的实际模型名称,your_time_column为目标时间列名
  • 如果求和结果超过24小时,SEC_TO_TIME()会返回超过24小时的格式(比如'25:30:00'),MySQL默认支持这种格式
  • 若需要将总时长拆成天、时、分、秒,可以在求和后自行处理秒数,比如:
    const totalSeconds = await YourModel.sum(sequelize.fn('TIME_TO_SEC', sequelize.col('your_time_column')));
    const days = Math.floor(totalSeconds / 86400);
    const hours = Math.floor((totalSeconds % 86400) / 3600);
    const minutes = Math.floor((totalSeconds % 3600) / 60);
    const seconds = totalSeconds % 60;
    console.log(`${days}天 ${hours}:${minutes}:${seconds}`);
    

内容的提问来源于stack exchange,提问作者Asistar srl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:30:49