在PostgreSQL中存储超过24:00:00的时间的最佳方法是什么?

4

我正在将GTFS数据存储到SQL数据库中,有些时间值预计会超过24:00:00的限制。例如,一些列车在凌晨12:30运行,但是它们被列在前一天的服务中,并且该运行时间以24:30的方式存储在GTFS规范中。

如何解决这个问题?我应该只将其存储为字符串吗?


有没有自然的截止时间,例如凌晨3点?为什么要采用这种花哨的方式,而不是在那个凌晨3点之前返回前一天的时间组件呢? - mlt
不太确定,但他们只是倾向于将深夜运行与前一天合并。截止点是一个有趣的想法,理论上我可以将截止时间设置为00:00:00,因为这仍然是一个24小时循环。这样做的困难在于不同的交通机构可能有不同的截止时间,但我可以将截止时间存储在单独的列中,以帮助跟踪00:00:00的含义。 - Jimmy Gong
1
这很有趣,因为你实际上是在存储时间而不是间隔。通常当人们问这个问题时,他们想要存储几个小时,而不是实际的时间。一种选择是通过将服务推迟到第二天并从时间中减去24小时来规范化时间。你可以(滥用)interval,但它有点丑陋。在这种情况下,回退到整数秒可能是有意义的。 - Craig Ringer
2个回答

5
建议使用int类型...你的值可能是:
Sec + Min * 60 + Hour * 3600

对于24:30:00,您将得到88200。

当从数据库中加载值时,您可以通过简单的数学方程将其反转:

Hour = int(value / 3600)
Min  = int(value % 3600 / 60)
Sec  = value % 3600 % 1800

这使得许多计算(如计算等待时间)变得更加容易,我发现这是最好的方法。此外,请注意,GTFS 中指定的时间并不是真正的挂钟时间,而是“中午减去 12 小时”的偏移量,这种数字表示使其更加明确。 - user473305

1

我会存储两个字段:

departure_time timestamp with time zone,
service_date date

出发时间将像这样计算:

 => select '2015-07-08'::timestamptz+'24:30'::interval;
 2015-07-09 00:30:00+02

这样做:
  • 您将获得一个正常的按事件排序的时间字段;
  • 您不会丢失服务日期信息;
  • 如果需要,您可以计算回原始GTFS数据。

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