PostgreSQL 找到两个时间戳之间的中点

PostgreSQL to find midpoint between two timestamps

我正在将一些东西从 SQL 服务器转换到 PostgreSQL。有一个 table BeginTime 和 EndTime 之间的计算字段称为 MidTime。时间是从视频剪辑的开头偏移的,并且永远不会超过大约 6 分钟。在SQLServer中,BeginTime、EndTime、MidTime都是TimeSpans。您可以将其用作函数:

DATEADD(ms, DATEDIFF(ms,BeginTime, EndTime)/2, BeginTime)

这是将两个时间跨度(以毫秒为单位)的差异除以 2,然后将其添加到 BeginTime。超级简单。结果如下所示:

ID  BeginTime   EndTime MidTime
10137   00:00:05.0000000    00:00:07.0000000    00:00:06.0000000
10138   00:00:08.5000000    00:00:09.6660000    00:00:09.0830000
10139   00:00:12.1660000    00:00:13.4000000    00:00:12.7830000
10140   00:00:14.6000000    00:00:15.7660000    00:00:15.1830000
10141   00:00:17.1330000    00:00:18.3000000    00:00:17.7160000
10142   00:00:19.3330000    00:00:21.5000000    00:00:20.4160000
10143   00:00:23.4000000    00:00:25.4000000    00:00:24.4000000
10144   00:00:25.4330000    00:00:26.8330000    00:00:26.1330000

我查看了 PostgreSQL 中可用的所有不同内容,但没有看到类似的内容。我将 BeginTime 和 EndTime 存储为 "time without time zone" time(6) 值,它们在数据库中看起来是正确的。我可以将它们彼此相减,但我无法将以毫秒为单位的值减半(不允许进行时间划分),然后没有明显的方法可以将毫秒数加回 BeginTime。

我查看了 EXTRACT,当您要求毫秒时,它会为您提供秒和毫秒的值,但只是那部分时间。我似乎无法表示可以减去、除以然后将结果加回另一个时间的时间。

我正在使用 Postgres 9.4,我没有看到任何简单的方法可以做到这一点,而不会将日期分解为组成部分并获得整体毫秒数(看起来它可以工作,但我不想这样做丑陋的东西,如果我不需要),或者将所有内容转换为 unix 日期时间,然后进行计算,然后如何将其恢复为 "time without time zone."

并不明显

我希望我缺少一些优雅的东西?或者也许有更好的方法将这些存储在更容易工作的地方?我只对时间部分感兴趣,所以 time(6) 似乎最接近 Sql 服务器的 TimeSpan。

只需从另一个中减去一个除以二,然后将其添加到开始时间:

begintime + (endtime - begintime)/2

不能除 time 值是正确的。但是 endtime - begintime 的结果不是 time,而是 interval。你 可以 将间隔除以 2。

以上表达式适用于 timetimestampinterval 列。