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

时间:2016-01-10 21:41:41

标签: sql-server postgresql time timespan

我正在将某些东西从SQL Server转换为PostgreSQL。有一张桌子 BeginTime和EndTime之间的计算字段,称为MidTime。时间是从视频剪辑的开头偏移,并且永远不会超过大约6分钟。在SQL Server中,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存储为“没有时区的时间”时间(6)值,并且它们在数据库中看起来正确。我可以相互减去这些,但我不能得到以毫秒为单位的值减半(不允许分割时间)然后没有明显的方法将毫秒添加回BeginTime。

我看过EXTRACT,当你要求毫秒时,你会得到秒和毫秒的值,但只是那部分时间。我似乎无法表示我可以减去,除法,然后将结果添加到另一个时间的时间。

我正在使用Postgres 9.4而且我没有看到任何简单的方法这样做而不会将日期分成组件并获得整体毫秒(看起来它会起作用但我不想做这么难看的事情如果我不需要),或者将所有内容转换为unix日期时间然后进行计算,那么如何将其恢复到“没有时区的时间”并不明显。

我希望有一些我只是缺少的优雅?或者更好的方法来存储这些工作更容易?我只对时间部分感兴趣所以时间(6)似乎最接近Sql Server的TimeSpan。

1 个答案:

答案 0 :(得分:6)

从另一个中减去一个除以2并将其添加到开始时间:

time

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

上述表达式适用于timestampintervalHello {FullName}<br /><br/>. Your username is {Username}. 列。