【问题标题】:Postgres Duration StoragePostgres 持续时间存储
【发布时间】:2021-04-29 04:26:36
【问题描述】:

我想在数据库中存储一个持续时间,在我的情况下,它是一个训练持续时间(运动)。我们设置了训练的时间(日期时间)和训练的时长(持续时间)。

目前,我选择了Time 类型,然后我:01:00:00 进行了一个小时的训练,并在 PHP 中检索了一个 Datetime 对象(但我认为将它们相加并不理想例如),在我的表单中,我有一个不受欢迎的行为:当时间为空时,html 时间类型会自动设置当前小时。

我犹豫了:

  • 保持时间,这样的事情看起来合乎逻辑/简单:00:00:00
  • 将其存储为秒或分钟为整数,例如,可能更简单地做训练量的总和(需要创建一个转换器将其显示为 00:00 或 00:00:00,并找到一种很好的填充方式它的形式)
  • 一种我没想到的方式?

非常感谢您的帮助。

【问题讨论】:

  • 听起来像 INTERVAL,这是 PostgreSQL 中的标准数据类型。演示应该在 GUI 中完成,而不是在数据库中。 postgresql.org/docs/current/…

标签: php sql postgresql


【解决方案1】:

存储持续时间的正确数据类型是interval。

这使得日期算术变得容易:您可以简单地将持续时间添加到开始时间以获得结束时间:

SELECT INTERVAL '01:30:00';

 interval 
----------
 01:30:00
(1 row)

SELECT TIME '09:00:00' + INTERVAL '01:30:00';

 ?column? 
----------
 10:30:00
(1 row)

SELECT TIMESTAMP WITH TIME ZONE '2021-03-28 02:00:00+01' + INTERVAL '01:30:00';

        ?column?        
------------------------
 2021-03-28 04:30:00+02
(1 row)

【讨论】:

  • 非常感谢,我不知道那种类型。
【解决方案2】:

我不确定你的问题是什么。 Postgres 在time 数据类型上使用sum() 没有问题:

select sum(t)
from (values ('03:12:00'::time), ('05:27:00'), ('18:59')) v(t)

您也可以使用interval。

如果单个持续时间超过 24 小时,您可能会遇到问题。如果这是一个潜在问题,只需使用小时、分钟或秒即可。

如果您对“空”值有疑问,则需要明确设置它们。这听起来像是 HTML 方面的错误。

【讨论】:

  • 为什么是time 而不是interval?
  • @LaurenzAlbe 。 . .呃。这也有道理。实际上更有意义——除了超过 24 小时的值也开始包括天数。
  • 感谢您提供有关时间总和的信息。因为我不知道 Interval 类型,所以我没有想过要使用它。但这似乎是最好的方法。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2018-04-15
相关资源
最近更新 更多