【问题标题】:Get difference between TIMESTAMPs in MySQL and update another Column获取 MySQL 中 TIMESTAMP 之间的差异并更新另一列
【发布时间】:2016-10-11 07:06:45
【问题描述】:

我在 MySQL 数据库中有 2 列,数据类型为 TIMESTAMP。 对于每一行,我想将hh:mm:ss(hh 可能超过 24 或也可能是 3 位)中这两个时间戳之间的差异存储到另一列中。

我应该用什么来做这个?

我试过了,但它不起作用。

update ABC_TABLE set colC=TIMEDIFF(colA, colB);

colC 的类型为 TIME

|Field                   | Type         | Null | Key | Default | Extra
+------------------------+--------------+------+-----+---------+-------+
| colC                   | time         | YES  |     | NULL    |

【问题讨论】:

  • 将您的表记录与update 查询结果的结果一起添加到问题中。
  • 也发布show create table abc_table 结果。
  • @RavinderReddy 如果没有这些信息,这个问题就很好了。
  • 请添加示例记录以及所需的输出。
  • @fancyPants:我明白。但是当 OP 说更新不起作用时,我认为我们需要检查实际结构和示例记录是什么。

标签: mysql datetime time sql-update timestamp


【解决方案1】:

时间数据类型的小时部分不能包含大于 23 的值。您必须使用 char 或 varchar。

以秒为单位计算两个时间戳之间的差异,如下所示:

SELECT TIMESTAMPDIFF(SECOND, '2016-06-10 11:00:00', '2016-06-10 12:00:00');

然后你可以使用这个函数将秒转换成days:hours:minutes:seconds的格式

DROP FUNCTION IF EXISTS f_s2dhms;
DELIMITER $$
CREATE FUNCTION f_s2dhms(v_seconds INT)
RETURNS VARCHAR(15)
DETERMINISTIC
COMMENT 'converts seconds in days:hours:minutes:seconds'
BEGIN
DECLARE v_dhms VARCHAR(15);
DECLARE v_days INT;
DECLARE v_hours INT;
DECLARE v_minutes INT;

SET v_hours = v_seconds/3600;
SET v_minutes = (v_seconds % 3600) / 60;
SET v_seconds = (v_seconds % 3600) % 60;

IF (v_hours > 23) THEN
    SET v_days = v_hours / 24;
    SET v_hours = v_hours % 24;
ELSE
    SET v_days = 0;
END IF;

RETURN CONCAT(v_days, ':', RIGHT(CONCAT('0', v_hours), 2), ':', RIGHT(CONCAT('0', v_minutes), 2), ':', RIGHT(CONCAT('0', v_seconds), 2));

END $$
DELIMITER ;

像这样使用它

SELECT f_s2dhms(TIMESTAMPDIFF(SECOND, '2016-06-10 11:00:00', '2016-06-10 12:00:00'));
  • here 你可以阅读更多关于timestampdiff()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多