在MySQL中存储时间间隔值的最佳方法?

时间:2009-10-08 20:09:13

标签: mysql

愚蠢容易出问题,但我一直无法找到优雅的解决方案。我想在MySQL列中存储时间间隔,例如:

1:40(一小时40分钟) 0:30(30分钟)。

然后能够运行查询,总结它们。现在我将它们存储为INT值(1.40),但我必须手动进行添加(除非我错过了一种更简单的方法)。

TIME列类型只存储长达900小时(约,我认为),所以这几乎是无用的,因为我跟踪了数十万小时(我存储了一个字段,其中包含许多不同条目的总和) )。

谢谢!

5 个答案:

答案 0 :(得分:9)

只存储分钟,因此1:40存储为100.这样可以轻松添加:100 + 30 = 130.当您显示时,请将数学转换回小时:分钟。 130分钟 - > 2:10。

答案 1 :(得分:6)

我只是将它们存储在INT字段中,如秒或分钟(或者您使用的最低时间值)。

例如,您希望存储以下时间值1小时34分25秒:

那是5665秒。因此,只需将值存储在INT字段中的5665

稍后,假设您要存储时间值56分7秒:

那是3367秒。

稍后总结一切:5665 + 3367 = 9032秒

将其转换回小时,分钟,秒,你得到2小时30分32秒。是的,你必须进行数学计算以进行转换,但这是一个非常简单的计算,并且它不是机器密集型,因为你只是在存储INT之前或者在检索INT之后只进行一次。< / p>

答案 2 :(得分:5)

你绝对可以使用int字段,特别是因为MySQL提供了DATE_ADDDATE_SUB函数,用于在日期artihmetic中使用整数时间单位以及日期和日期时间类型。 / p>

例如,如果您有一个日期时间列eventDateTime并且您有一个持续时间列durationMinutes,则可以使用以下方式计算结束日期时间:

DATE_ADD(eventDateTime,INTERVAL durationMinutes MINUTE)

答案 3 :(得分:0)

如果您想将它们存储为小时,从而保持整数较小,则可以将分钟数除以60。

所以1:40变为100/60 = 1.66,:30变为30/60 = .5。现在你可以正常添加它们:

  1.66 + .5 =  2.16

然后你有整个小时数,小数部分是超过60的分钟数,所以这将是

   .16 * 60 = 10

所以它是2:10

您的下一个最佳选择是查看MySQL是否可以执行base60。

答案 4 :(得分:0)

我知道这不是你所说的那段时间间隔,当我在周围搜索时,这是我发现的唯一相关的SO问题,所以为了帮助像我这样的其他失落的灵魂,我想我会发布什么我现在在做。

我正在存储订阅长度,而不是像“秒数”或甚至分钟这样的精确值是。所以在我的情况下,我有一个“持续时间”INT和一个“duration_unit”ENUM('days','months')。

所以对于“6个月”的订阅而不是试图计算6个月内的分钟数(根据您所说的6个月而变化)我只存储“6”和“月”。

使用PHP的mktime()方法,计算+6个月的时间间隔变得简单而准确。

相关问题