【问题标题】:MySQL convert timediff output to day, hour, minute, second formatMySQL 将 timediff 输出转换为日、时、分、秒格式
【发布时间】:2011-07-13 20:08:31
【问题描述】:

这是我的查询:

SELECT TIMEDIFF(end_time,start_time) AS "total" FROM `metrics`;

这给了我:

116:12:10

意思是 116 小时 12 分 10 秒。

相反,我想说的是 4 天 20 小时 12 分钟等

【问题讨论】:

  • 我不确定是否有任何内置函数,我认为可以通过应用简单的数学来完成......

标签: mysql


【解决方案1】:
SELECT CONCAT(
FLOOR(HOUR(TIMEDIFF('2010-01-06 08:46', '2010-01-01 12:30')) / 24), ' days ',
MOD(HOUR(TIMEDIFF('2010-01-06 08:46', '2010-01-01 12:30')), 24), ' hours ',
MINUTE(TIMEDIFF('2010-01-06 08:46', '2010-01-01 12:30')), ' minutes')

在我的示例中使用您的 end_time 和 start_time 作为固定日期时间值

根据以下两个 cmets,此解决方案仅适用于 35 天内的日期差异。如果您知道开始和结束之间的间隔超过 35 天,即一个月的差异,请不要使用它。此处使用 TIMESTAMPDIFF 的其他答案将起作用。

【讨论】:

  • @richard : 您的查询将因长差日期而失败。阅读此microshell.com/database/mysql/…
  • 此函数将因以下输入而失败:SELECT CONCAT( FLOOR(HOUR(TIMEDIFF('2010-03-06 08:46', '2010-01-01 12:30')) / 24 ), '天', MOD(HOUR(TIMEDIFF('2010-03-06 08:46', '2010-01-01 12:30')), 24), '小时', MINUTE(TIMEDIFF('2010- 03-06 08:46', '2010-01-01 12:30')), '分钟')
【解决方案2】:
SELECT 
CONCAT(
TIMESTAMPDIFF(day,'2001-01-01 00:00:00','2001-01-02 23:10:00') , ' dagen ',
MOD( TIMESTAMPDIFF(hour,'2001-01-01 00:00:00','2001-01-02 23:10:00'), 24), ' uren ',
MOD( TIMESTAMPDIFF(minute,'2001-01-01 00:00:00','2001-01-02 23:10:00'), 60), ' minuten '
)

【讨论】:

  • 如果您因为时差太大而无法使用TIMEDIFF,这是一个很好的选择
【解决方案3】:

试试

SELECT @s:='2016-03-01' started, @e:= '2018-04-21' ended, 
FLOOR((@ms:=TIMESTAMPDIFF(MONTH,@s,@e))/12) yrs, (@ms%12) mns, 
@d:=TIMESTAMPDIFF(DAY,@s:=DATE_ADD(@s,INTERVAL @ms MONTH), @e) dys,
@hr:=TIMESTAMPDIFF(HOUR,@s:=DATE_ADD(@s, INTERVAL @d DAY),@e) hrs,
TIMESTAMPDIFF(MINUTE,TIMESTAMPADD(HOUR,@hr,@s),@e) mins;

这将为您提供两个日期之间的年、月、日、小时和分钟的细分。

希望它对某人有所帮助。

【讨论】:

    【解决方案4】:

    我使用了 Bodgans 给出的答案,但我添加了一个条件,在小于 10 的数量之前插入一个 0。

    CONCAT(
      IF(FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400) < 10, '0', ''),    FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400), ' days ',
      IF(FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600) < 10, '0', ''), FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
      IF(FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60) < 10, '0', ''), FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
      IF((TIMESTAMPDIFF(SECOND, startDate, endDate) % 60) < 10, '0', ''), (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
    )
    

    这样,我们可以得到如下结果

    09 天 10 小时 06 分 30 秒

    【讨论】:

      【解决方案5】:

      最简单的方法是

      CONCAT(
        FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400), ' days ',
        FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
        FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
        (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
      )
      

      要仅显示相关信息,您需要做一个更复杂的版本

      IF(
        FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400) = 0,
        IF(
          FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600) = 0,
          IF(
            FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60) = 0,
            CONCAT((TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'),
            CONCAT(
              FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
              (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
            )
          ),
          CONCAT(
            FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
            FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
            (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
          )
        ),
        CONCAT(
          FLOOR(TIMESTAMPDIFF(SECOND, startDate, endDate) / 86400), ' days ',
          FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 86400)/3600), ' hours ',
          FLOOR((TIMESTAMPDIFF(SECOND, startDate, endDate) % 3600)/60), ' minutes ',
          (TIMESTAMPDIFF(SECOND, startDate, endDate) % 60),  ' seconds'
        )
      )
      

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 2013-08-18
        • 2017-05-10
        相关资源
        最近更新 更多