2012-05-14 39 views
3

使用PostgreSQL 9.1與Linux psql的控制檯和窗戶pgadminIII查詢:JDBC VS PSQL間隔呈現差異

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) 

然而,窗戶JDBC驅動器(具體地使用jasperreport的ireport)呈現相同的查詢爲:

?column?  
----------------- 
0 years 0 mons 3 days 16 hours 43 mins 57.00 secs 
(1 row) 

我探索過to_charpostgresql documentation,但無法找到解決方案。兩個問題:首先,如何使JDBC驅動程序以與pqsl相同的格式顯示間隔?

其次,可我反而使雙方的psql和JDBC渲染結果爲:

88:43:57 

哪裏小時繼續計數到100秒爲間隔的增長(其一個愚蠢的行業標準......)

+0

你可以運行查詢:「秀LC_TIME;」使用兩個客戶並向我們展示結果? –

+0

@SzymonGuz所有結果如下:'en_US.UTF-8'按預期。 – Justin

回答

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; 
0

我不知道,你可以使用任何標準的功能,但你總是可以格式化是這樣的:

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 
); 
+0

是的...我希望避免這種情況。期望JDBC驅動程序呈現與psql相同的結果似乎是一件合理的事情,但我想你永遠無法確定使用java。 – Justin

1

「首先,我該如何使JDBC驅動程序以與pqsl相同的格式顯示間隔?」
我認爲這個問題實際上並沒有明確定義。 org.postgresql.util.PGInterval類型的對象沒有格式。當然,如果你對它調用toString(),那麼你會得到一些東西。你會得到什麼iReport顯示。所以從某種意義上說,這是它的默認格式。但真的它只是一堆年,月,日,小時,分鐘和一個秒的整數。這不是一個格式化的東西。

pgAdmin III做了一些神奇的事情來更好地格式化它。但是這個神奇的東西並不是內置在JDBC驅動程序中的。 Szymon的答案肯定會奏效。但......呃。

「其次,可我反而使雙方的psql和JDBC渲染結果爲:88:43:57
你可以把邏輯放到生成.jrxml而不是Szymon的過程。這會更好,因爲......好吧......它不會更好。它會有所不同。它會讓你通過在報告中計算這個值來修改SQL查詢:

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

這不是100%正確的。您需要截斷(round?)從double到int的秒數以滿足您的需求。而要完全通用,你需要在數月和數年內添加,但也許你並不真正關心這些。無論如何,你可能這樣做。警告間隔。

+0

我喜歡.jrxml版本......但它是否可修改以包含跨月的間隔?或者是我最好的選擇就是去提取('epoch',...)'和整數數學版本的東西? – Justin

+0

'interval'和'month'之間的一個有趣的交互/衝突。在我看來,一旦間隔包含超過零個月,那麼你已經在幾天/小時/分鐘/秒的時間內失去了精確度。我不確定。但我會使用紀元時間,並使用整數數學,如你所建議的。 – mdahlman

+0

看到我的功能如下。 – Justin

0

當您將列間隔轉換爲文本時,它應該出現在jasper報告的sql查詢結果中。

關於第一個問題,下面::text使用應解決的問題

select ('2012-05-05 15:57:31-07'::timestamp with time zone - '2012-05-01 
23:13:34-07'::timestamp with time zone)::text;