2016-01-10 83 views
0

我正在將某些東西從SQL Server轉換爲PostgreSQL。有一張表格,其中有一個 計算字段,它們在BeginTime和一個名爲MidTime的EndTime之間。時間是從視頻剪輯開始的偏移量,永遠不會超過6分鐘左右。在SQL Server中,BeginTime,EndTime和MidTime都是TimeSpans。您可以使用此作爲功能:PostgreSQL找到兩個時間戳之間的中點

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

這是走差異在這兩個時間跨度在millseconds,除以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。

+2

在Postgres中沒有數據類型'沒有時區'。無論是「時間」還是「沒有時區的時間戳」。我對SQL Server的數據類型並不熟悉,但'timespan'聽起來更像是要將它存儲爲'interval'而不是'time'值 –

+0

謝謝。當我創建表格時,我使用了「沒有時區的時間」,因爲我在下面鏈接的頁面上(在頂部的表格中)閱讀了關於[無時區]的內容,而且像inner這個詞在內部連接中一樣是可選的,但我想確保數據類型沒有混淆(並且我對postgres沒有經驗),所以我儘可能具體。 http://www.postgresql.org/docs/9.4/static/datatype-datetime.html –

+0

也就是說,我認爲你現在已經看過了間隔,我可能想要一個BeginTime和Duration間隔,和一個計算出的EndTime(應用程序使用一次或兩次)。做一個快速端口,如果下面的答案不起作用,我會重構。 –

回答

3

兩個僅有減去從另一個鴻溝,並把它添加到BEGINTIME:

begintime + (endtime - begintime)/2 

這是正確的,你不能分割time值。但endtime - begintime的結果不是time而是interval。你可以通過 2.

上述表達式作品分割的間隔與timetimestampinterval列。

+0

謝謝。當然,這個工作很完美,比SQL Server DATEADD噩夢更加優雅。我看了6次這樣的文檔頁面,但沒有看到它,我讀到的有關不分割的一點看起來很重要,並且讓我產生了偏見。 ;)謝謝馬。 –