2016-06-28 71 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