【问题标题】:mysql timediff to hoursmysql timediff 到小时
【发布时间】:2011-01-11 13:21:44
【问题描述】:

我正在尝试从我的表中获取 timediff 并将其转换为小时(这是按小时计费的服务)

SELECT TIME_TO_SEC(TIMEDIFF(endDate,startDate))/3600 FROM 任务 >

endDate 和 startDate 是日期时间格式

还有其他方法(更有效)来完成这项任务吗? 谢谢!

【问题讨论】:

  • 可能duplicate.
  • 我想每个人都错过了一个非常重要的点——因为它不是技术人员。按小时计费的事情通常按开始小时而不是完成小时计费。因此,所有这些答案可能都需要汇总。例如,1 小时 1 分钟 == 2 小时计费(就像支付停车费等)

标签: php mysql


【解决方案1】:

TIMEDIFF(endDate, startDate) 以 DateTime 格式输出,如此平坦以至于时间戳和除以 (60*60)

SELECT (UNIX_TIMESTAMP(TIMEDIFF(endDate, startDate))/(60*60)) AS hours_difference
FROM tasks

编辑: 或者,TimestampDiff 也可以以更优雅的方式提供有效的解决方案,提供其示例:

SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');

您的解决方案可以是:

SELECT TIMESTAMPDIFF(HOUR, startDate, endDate) AS hours_different
FROM tasks

【讨论】:

  • 正确参数TIMESTAMPDIFF(HOUR, startDate, endDate)
  • 奇怪的是,UNIX_TIMESTAMP 返回 0 并且 TimeStampDiff 对于 MySQL 5.0 版中的所有值都返回 NULL(非常过时)。 OP 的方法在这种情况下有效。
  • 请注意,TIMEDIFFTIMESTAMPDIFF 不考虑夏令时更改。如果在您的情况下获得/损失的时间很重要,@Donny Kurnia 的以下回答效果最好。
【解决方案2】:

注意,这条链中投票最多的答案是不正确的!使用 HOUR 只会将小时数作为整数返回。下面将更正最流行的答案,将小时作为整数返回,将分钟作为小数返回(即 6.5 小时)。

TIME_TO_SEC(TIMEDIFF(endDate, startDate))/3600 as hours

【讨论】:

  • 在这种情况下,正如 OP 所说“这是按小时计费的服务”,我想您可能希望将任何分数向上舍入到下一个整小时。所以,是的,另一个人可能是错的,因为他返回一个 INTEGER,但听起来 OP 想要一个整数四舍五入
  • 语义学,按半小时或其他分数计费的“每小时”工作并不是什么稀奇事。为什么不一次覆盖所有基地?
【解决方案3】:
HOUR(TIMEDIFF(endDate, startDate))

如果我正确阅读了文档,可能会起作用。

【讨论】:

  • 别忘了这个函数舍入
【解决方案4】:
TIMESTAMPDIFF(HOUR, startDate, endDate)

是最好的方法,因为它适用于较大的时间间隔,例如

TIMESTAMPDIFF(HOUR, "2012-01-01 00:00:00", "2050-01-01 00:00:00")

结果:333120

同时

HOUR(TIMEDIFF("2050-01-01 00:00:00", "2012-01-01 00:00:00"))

结果:838

失败。

正如我们在上面的示例中看到的,令人惊讶的是,它甚至超出了 2038 年的时间戳限制。

HOUR(TIMEDIFF(dateEnd, dateStart)) 返回的最大小时数为 838,因为 TIMEDIFF 被限制在 TIME 值允许的范围内。

【讨论】:

    【解决方案5】:

    您可以使用UNIX_TIMESTAMP在SELECT查询中进行计算。

    SELECT (UNIX_TIMESTAMP(endDate)-UNIX_TIMESTAMP(startDate))/3600 hour_diff
      FROM tasks
    

    UNIX_TIMESTAMP 将日期时间转换为纪元的秒数​​。您可以减去两个时间戳以获得秒差。将其除以 3600 会产生小时差。

    【讨论】:

    • 准确度的最佳答案 - TIMEDIFFTIMESTAMPDIFF 不考虑夏令时变化。
    • 如之前的评论中所说,这说明了夏令时,太棒了!
    • @RogerDueck, @Gusmar 我没有看到它是如何考虑夏令时的......使用这个 SQL,我仍然得到 12(当我应该得到 13):SELECT (UNIX_TIMESTAMP('2018-11-04 07:00:00')-UNIX_TIMESTAMP('2018-11-03 19:00:00')) / 3600 hourDiff;
    • @RogerDueck 没关系。你们俩都是对的,但是需要将一个数据库或 db sesson 的时区设置为遵守夏令时的时区。例如,UTC 不遵守 DLS。
    【解决方案6】:

    获取小时差异:

    Hour(TIMEDIFF(date1,date2)) as Hour1
    

    在分钟内获得差异:

    Minute(TIMEDIFF(date1,date2)) as Minute1
    

    获得秒差:

    Second(TIMEDIFF(date1,date2)) as Second1
    

    【讨论】:

    • 我认为这部分不正确? minute 和 second 函数不会以分钟或秒的形式返回时间。它们返回值的分钟或秒部分。例如,“second”函数总是返回一个介于 0 和 59 之间的值。“Hour”似乎表现不同dev.mysql.com/doc/refman/5.7/en/…
    • 我的时差是 65 小时 42 分钟,Hour() 函数准确返回 65 小时,Minute() 函数返回 42 分钟。如果这就是你想要的,太好了,我希望从 Hour() 到 65.7 小时,从 Minute() 到 3942 分钟,所以时间戳方法对我来说更有用
    【解决方案7】:

    例如:开始日期 2010-01-31 00:00:00,结束日期 2010-01-31 19:24:22

    SELECT (UNIX_TIMESTAMP(dateFin)-UNIX_TIMESTAMP(dateDebut))/3600 hour_diff
    FROM tasks
    
    SELECT TIME_TO_SEC(TIMEDIFF(endDate,startDate))/3600
    FROM tasks 
    

    返回 19.4061,这很好

    SELECT TIMESTAMPDIFF(HOUR, endDate, startDate) AS hours_different
    FROM tasks
    

    只返回小时,而我还需要转换分钟。

    SELECT (UNIX_TIMESTAMP(TIMEDIFF(endDate, startDate))/(60*60)) AS hours_difference
    FROM tasks
    

    返回 0。 我认为第一个是最有效的。谢谢!!

    【讨论】:

    • 您应该选择已接受的答案之一,而不是像这样创建答案。另外,在适当的答案中使用注释,而不是重写或重新引用。
    • SELECT TIME_TO_SEC(TIMEDIFF(endDate,startDate))/3600 FROM tasks 不错
    【解决方案8】:

    你可以使用下面的mysql函数timestampdiff

    TIMESTAMPDIFF(HOUR, '2018-06-01 00:00:00', '2018-06-01 12:00:00') 
    

    【讨论】:

      【解决方案9】:
      select hour(timediff('2017-01-01 00:00:00', '2017-01-01 00:01:00'));
       return 1
      
      select hour(timediff('2017-01-01 00:01:00', '2017-01-01 00:00:00'));
       return 1 
      
      select time_to_sec(timediff('2017-01-01 00:00:00', '2017-01-01 00:00:05'));
      return -5
      
      select time_to_sec(timediff('2017-01-01 00:00:00', '2017-01-01 00:00:05'))/60 as 'minutes' ;
      return -0.0833  
      

      如果你有秒数,你可以随意转换它或什么 和 hours(..) 在我比较时不会使用它,因为它总是正值

      【讨论】:

        【解决方案10】:
        TIMEDIFF(endDate, startDate) / 10000
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          • 1970-01-01
          • 2021-12-30
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 2020-12-22
          相关资源
          最近更新 更多