3

Linux psql コンソールと Windows pgadminIII で postgresql 9.1 を使用すると、次のクエリが実行されます。

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)

postgresqlto_charのドキュメントを調べましたが、解決策が見つかりません。2 つの質問: まず、JDBC ドライバーが間隔を pqsl と同じフォーマットでレンダリングするようにするにはどうすればよいですか?

次に、代わりに psql と JDBC の両方で結果を次のようにレンダリングすることはできますか?

88:43:57  

間隔が大きくなるにつれて、時間は100秒単位でカウントされ続けます(これはばかげた業界標準です...)

4

3 に答える 3

1

「まず、JDBC ドライバーに間隔を pqsl と同じフォーマットでレンダリングさせるにはどうすればよいですか?」
この質問は実際には明確に定義されていないと思います。型のオブジェクトには形式org.postgresql.util.PGIntervalがありません。もちろん、その上で toString() を呼び出すと、何かが得られます。iReportが表示するものを取得します。ある意味では、これがデフォルトのフォーマットです。しかし、実際に、年、月、日、時、分を表す int と、秒を表す double の集まりにすぎません。それはフォーマットされたものではありません。

pgAdmin III は、より適切にフォーマットするためにいくつかの魔法を行います。しかし、この魔法は JDBC ドライバーには組み込まれていません。シモンの答えは確かにうまくいくでしょう。しかし... 漂白剤。

「次に、代わりに psql と JDBC の両方で結果を次のようにレンダリングする ことはできますか? 88:43:57
これはもっと良いでしょう... まあ... それは本当に良いことではないからです. それはただ違うでしょう。レポートでこれを計算することにより、SQL クエリを変更せずにそのままにしておくことができます。

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

それは 100% 正しくありません。要件のために、秒を double から int に切り詰める (丸める?) 必要があります。そして、完全に汎用的にするには、月と年を追加する必要がありますが、それらはあまり気にしないかもしれません。とにかく、あなたはこのようにすることができます。警告間隔。

于 2012-05-15T06:29:59.567 に答える
0

必要なことを行う関数を自分で作成しました。私はすべて、提案、改善、および最適化に耳を傾けています。

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;
于 2012-05-16T17:08:51.877 に答える