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。
以上表达式适用于 time
、timestamp
或 interval
列。
我正在将一些东西从 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。
以上表达式适用于 time
、timestamp
或 interval
列。