MySQL存储持续时间时间-数据类型是什么?

41

我需要计算用户在网站上的停留时间。它是登出时间和登录时间之间的差别,给出像“ X 先生在线上花费了4小时43分钟”的结果。因此,要存储4小时43分钟的值,我像这样声明:

duration time NOT NULL

这是有效的方式还是有更好的存储方法?我需要将其存储在数据库中,因为我需要将其用于其他计算和用例。

3个回答

54

将其存储为整数秒数将是最好的方法。

  • UPDATE将会更加简洁明了,即duration = duration + $increment
  • 正如Tristram所指出的那样,使用TIME字段存在限制,例如“TIME值的范围可能从'-838: 59: 59'到'838: 59: 59'
  • 天数/小时/分钟/秒钟的显示格式不会被硬编码。
  • 当使用整数“秒数”字段时,执行您的其他计算几乎肯定会更清晰。

3
我肯定会选择“TIME”。我无法想象有人连续34天在线。如果真的这样,我准备让这个罕见的情况出现错误。使用“ADDTIME()”可以轻松地进行“UPDATE”语句。使用它,您还可以添加像30分钟和23秒这样的时间而不需要将其转换为秒。没有硬编码,您始终可以使用“TIME_TO_SEC()”-如果您真的需要(我怀疑) 。 - Gerald

0

我不会使用时间,因为你会受到24小时的限制。最简单的方法就是将一个整数以分钟(或秒,取决于所需的分辨率)的形式存储。


整数不会给出像4小时、45分钟32秒这样的精确时间,除非我将其存储为秒?我希望能够直接在数据库中自动格式化输入为x小时、x分钟(也许还要加上x秒),而不是将其存储为474747474秒,这又需要转换成人类可读的形式。 - Juds
@Juds 我认为在数据库中拥有格式化的时间间隔的便利性被@Tristram和@Riedsio提到的许多其他因素所抵消。为什么不让时间间隔的格式化成为表现层的问题呢? :) - Dan J
6
时间不仅限于24小时,参见上文。 - Ashley

-3

考虑将两个值都存储为UNIX时代差。

通常我更喜欢使用带符号的(64位)大整数(用于秒级分辨率),或者带符号的(64位)双精度浮点数(如果需要小数秒),或者带符号的(32位)整数(如果缩小到分钟或小时)。

在列名中明确单位,例如使用后缀“_epoch_minutely”,例如:“started_epoch_minutely”,“finished_epoch_minutely”。


不太确定您的意思。有关“UNIX-epoch-delta”的文档吗?举个例子会更好。另外,欢迎来到[so]!(请查看[answer])。 - ashleedawg
“UNIX-epoch-delta” 就是 UNIX time() 值,它代表的是自 UNIX-epoch(即 1970 年 1 月 1 日 00:00:00 UTC)以来经过的秒数。 - druid62
这有点无意义,因为它完全复制了MySQL内置的标准时间戳功能。 - Synchro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接