JDBC与psql间隔呈现差异

JDBC与psql间隔呈现差异,jdbc,jasper-reports,ireport,postgresql,Jdbc,Jasper Reports,Ireport,Postgresql,将postgresql 9.1与linux psql控制台和windows pgadminIII一起使用,查询: select '2012-05-05 15:57:31-07'::timestamp with time zone - '2012-05-01 23:13:34-07'::timestamp with time zone; 将报税表呈现为: ?column? ----------------- 3 days 16:43:57 (1 row) 但是,window

将postgresql 9.1与linux psql控制台和windows pgadminIII一起使用,查询:

select '2012-05-05 15:57:31-07'::timestamp with time zone - '2012-05-01 23:13:34-07'::timestamp with time zone;
将报税表呈现为:

    ?column?     
-----------------
 3 days 16:43:57
(1 row)
但是,windows JDBC驱动程序(特别是使用jasperreport的ireport)将此查询呈现为:

    ?column?     
-----------------
 0 years 0 mons 3 days 16 hours 43 mins 57.00 secs
(1 row)
我已经探索了
到_char
的方法,但是找不到解决方案。两个问题:首先,如何使JDBC驱动程序以与pqsl相同的格式呈现间隔

第二,我是否可以让psql和JDBC将结果呈现为:

88:43:57  

随着时间间隔的增长,小时数会一直计算到100秒(这是一个愚蠢的行业标准…

我不知道您可以使用任何标准函数,但您可以总是这样格式化它:

CREATE OR REPLACE FUNCTION format_time(t INTERVAL) 
RETURNS TEXT
LANGUAGE PLPGSQL
AS $$
DECLARE
    res TEXT;
BEGIN
    res = 24 * EXTRACT(day FROM t ) + EXTRACT(hour FROM t );
    res = res || ':';
    res = res || EXTRACT(minute FROM t);
    res = res || ':';
    res = res || EXTRACT(second FROM t);
    RETURN res;
END;
$$;
SELECT format_time(
    '2012-05-05 15:57:31-07'::timestamp with time zone 
    - 
    '2012-05-01 23:13:34-07'::timestamp with time zone
);
您可以这样使用它:

CREATE OR REPLACE FUNCTION format_time(t INTERVAL) 
RETURNS TEXT
LANGUAGE PLPGSQL
AS $$
DECLARE
    res TEXT;
BEGIN
    res = 24 * EXTRACT(day FROM t ) + EXTRACT(hour FROM t );
    res = res || ':';
    res = res || EXTRACT(minute FROM t);
    res = res || ':';
    res = res || EXTRACT(second FROM t);
    RETURN res;
END;
$$;
SELECT format_time(
    '2012-05-05 15:57:31-07'::timestamp with time zone 
    - 
    '2012-05-01 23:13:34-07'::timestamp with time zone
);
“首先,如何使JDBC驱动程序以与pqsl相同的格式呈现间隔?”
我认为这个问题实际上没有很好的定义。类型为
org.postgresql.util.PGInterval
的对象没有格式。当然,如果对其调用toString(),则会得到一些结果。你会得到iReport显示的内容。从某种意义上说,这是它的默认格式。但实际上,它只是一堆年、月、日、小时、分钟的整数,还有一个秒的双精度整数。这不是格式化的东西

pgAdmin III做了一些魔术,使它的格式更美观。但是JDBC驱动程序并没有内置这种魔力。西蒙的回答肯定会奏效。但是哎哟

“第二,我可以让psql和JDBC将结果呈现为:
88:43:57

您可以将逻辑放入.jrxml而不是Szymon的过程中。这会更好,因为。。。好。。。这真的不会更好。那就不一样了。通过在报告中计算以下内容,您可以不修改SQL查询:

$F{?column?}.getDays() * 24 + $F{?column?}.getHours()
+ ":" + $F{?column?}.getMinutes() + ":" + $F{?column?}.getSeconds()

这不是100%正确。您需要根据需要将秒数从一个double截断为一个int。要完全通用,你需要在几个月或几年内添加,但也许你并不真正关心这些。无论如何,你可以这样做。警告间隔。

我给自己做了一个函数,可以满足我的需要。我会倾听建议、改进和优化

create or replace function format_hours(started timestamp with time zone, stopped timestamp with time zone)
returns text as $$
declare
        epoch_interval integer := extract(epoch from stopped - started);
        hours integer   := floor(epoch_interval/3600);
        minutes integer := floor((epoch_interval-hours*3600)/60);
        seconds integer := floor((epoch_interval-hours*3600-minutes*60));
begin
      return hours::text || ':' ||
             to_char(minutes, 'FM00') || ':' ||
             to_char(seconds, 'FM00');
end;
$$ language plpgsql;

您可以使用两个客户端运行查询:“show LC_TIME;”并向我们显示结果吗?@SzymonGuz所有结果均为:
en_us.UTF-8
。是的。。。我希望避免这种情况。期待JDBC驱动程序呈现出与psql相同的效果似乎是合理的,但我想您永远无法确定java。。。但它是否可以修改为包含跨越数月的时间间隔?或者我的最佳选择是直接进入事物的
提取('epoch',…)
和整数数学版本吗?这是
间隔
月份
之间有趣的互动/冲突。在我看来,一旦时间间隔超过零个月,那么您就失去了大约天/小时/分钟/秒的精度。我不确定。但我会使用大纪元,并按照你的建议使用整数数学。