2016-06-28 35 views
1

你好,我想顯示兩個日期之間的SQL差異:
* END DATE = dt_termino/NOW()
* START DATE = dt_inicio
差之間兩個日期的PostgreSQL以Excel格式

我有一個函數在CSV ......但在我的CSV輸出中像這樣寫:

id_task_tarefa |  dt_inicio  |  dt_termino  |  sum 
211   | 2016-01-25 10:40:25 | 2016-01-27 08:51:02 | 01 22:10:37 
210   | 2016-01-25 10:40:29 | 2016-01-27 08:50:21 | 01 22:09:52 

我需要在Excel中[H]的格式輸出:MM:SS; @ 這樣

id_task_tarefa |  dt_inicio  |  dt_termino  | sum 
211   | 2016-01-25 10:40:25 | 2016-01-27 08:51:02 | 46:10:37 
210   | 2016-01-25 10:40:29 | 2016-01-27 08:50:21 | 46:09:52 

這裏是我的SQL:

SELECT id_task_tarefa, 
     dt_inicio, 
     dt_termino, 
     to_char(COALESCE(dt_termino::timestamp, now()::timestamp) 
      - dt_inicio::timestamp,'DD HH24:MI:SS') 
FROM crm.task_interacao 
+0

考慮到'提取物(從timestamp1時代 - timestamp2)'返回第二的兩個時間戳之間的秒數。然後你可以使用簡單的公式將其轉換爲小時,分鐘和秒鐘:'x :: int /(60 * 60)as h,x :: int%(60 * 60)/ 60 as m,x :: int% 60 as s' – Abelisto

回答

2

在F恩膏可以對您方便:

create or replace function interval_in_hours(interval) 
returns text language sql as $$ 
    select format('%s:%s', 
     (extract (epoch from $1)/3600)::int, 
     to_char($1, 'mi:ss')) 
$$; 

用途:

with the_data (id_task_tarefa, dt_inicio, dt_termino) as (
    values 
     (211, timestamp '2016-01-25 10:40:25', timestamp '2016-01-27 08:51:02'), 
     (210, timestamp '2016-01-25 10:40:29', timestamp '2016-01-27 08:50:21') 
    ) 

select *, interval_in_hours(dt_termino- dt_inicio)::interval as sum 
from the_data; 

id_task_tarefa |  dt_inicio  |  dt_termino  | sum  
----------------+---------------------+---------------------+---------- 
      211 | 2016-01-25 10:40:25 | 2016-01-27 08:51:02 | 46:10:37 
      210 | 2016-01-25 10:40:29 | 2016-01-27 08:50:21 | 46:09:52 
(2 rows) 
+0

我想知道你爲什麼返回文本而不是返回間隔?現在我看到間隔顯示正確的格式,不會轉換不同間隔解決它容易嗎? –

+0

該函數類似'to_char()','format()'等方式返回文本,將其更改爲間隔沒有問題。在這個例子中,我將結果轉換爲時間間隔以確保格式是正確的,但當然是不必要的(我可以在沒有任何視覺差異的情況下留下文本)。 – klin

+0

這個奇怪的部分是''46:09:52':: interval'返回'46:09:52'而不是'01 22:10:3​​7'在這種情況下,可能有一種方法可以將'(timestamp - 時間戳)::間隔'直接到我們想要的格式。 –

3

不知道是否有更好的辦法,但工程

SELECT '2016-01-25 10:40:25' start_date, 
     '2016-01-27 08:51:02' end_date, 
     to_char('2016-01-27 08:51:02'::timestamp 
      - '2016-01-25 10:40:25'::timestamp,'HH24:MI:SS') as sum_text, 
     TRUNC(EXTRACT(epoch FROM '2016-01-27 08:51:02'::timestamp - '2016-01-25 10:40:25'::timestamp)/3600) time_diff, 
     TRUNC(EXTRACT(epoch FROM '2016-01-27 08:51:02'::timestamp - '2016-01-25 10:40:25'::timestamp)/3600) || ':' || 
     to_char('2016-01-27 08:51:02'::timestamp 
      - '2016-01-25 10:40:25'::timestamp,'MI:SS') result 

輸出

enter image description here