Excel格式的postgresql两个日期之间的差异

Excel格式的postgresql两个日期之间的差异,postgresql,csv,Postgresql,Csv,您好,我想显示两个日期之间的SQL差异: *结束日期=终止日期/现在 *开始日期=dt_inicio 我有一个函数写在CSV。。。但在我的csv输出中: 我需要一个格式输出到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

您好,我想显示两个日期之间的SQL差异: *结束日期=终止日期/现在 *开始日期=dt_inicio

我有一个函数写在CSV。。。但在我的csv输出中:

我需要一个格式输出到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

不确定是否有更好的方法,但有效

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
输出


不确定是否有更好的方法,但有效

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
输出


该功能可能对您很方便:

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'))
$$;
使用:


该功能可能对您很方便:

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'))
$$;
使用:


考虑TimeSTAMP1-TimeSTP2中的ExtPoPoCH返回两个时间戳之间的第二个数。然后您可以使用简单的公式将其转换为小时、分钟和秒:x::int/60*60作为h,x::int%60*60/60作为m,x::int%60作为从时间戳1提取历元的sConsider-时间戳2返回两个时间戳之间的秒数。然后,您可以使用简单的公式将其转换为小时、分钟和秒:x::int/60*60为h,x::int%60*60/60为m,x::int%60为sI,您想知道为什么返回文本而不返回间隔?现在我看到interval显示了正确的格式,将different转换为interval不是很容易解决吗?函数返回类似于字符、格式等的文本。将其更改为interval没有问题。在本例中,我将结果强制转换为interval,以确保格式正确,但是这是不必要的,当然我可以在没有任何视觉差异的情况下留下文本。奇怪的部分是'46:09:52'::interval返回46:09:52而不是01 22:10:37在这种情况下,也许有一种方法可以将timestamp-timestamp::interval直接转换为我们想要的格式。没有什么奇怪的,间隔“20:00:00”+间隔“20:00:00”给出“40:00:00”。这里有一个函数,可以用“1天16:00:00”代替。据我所知,没有一个标准的反转函数。你怎么不觉得奇怪+产生40:00:00但是-产生01 22:10:37??我想知道你为什么返回文本而不是返回间隔?现在我看到interval显示了正确的格式,将different转换为interval不是很容易解决吗?函数返回类似于字符、格式等的文本。将其更改为interval没有问题。在本例中,我将结果强制转换为interval,以确保格式正确,但是这是不必要的,当然我可以在没有任何视觉差异的情况下留下文本。奇怪的部分是'46:09:52'::interval返回46:09:52而不是01 22:10:37在这种情况下,也许有一种方法可以将timestamp-timestamp::interval直接转换为我们想要的格式。没有什么奇怪的,间隔“20:00:00”+间隔“20:00:00”给出“40:00:00”。这里有一个函数,可以用“1天16:00:00”代替。据我所知,没有标准的反转功能。你怎么不觉得奇怪+生产40:00:00但是-生产01 22:10:37??